Interface für JButtons,...

Cem

Mitglied
Hallo allerseits 🙂

So wie der Titel schon indirekt sagt hat dieses Thema was mit swing zu tun

Ich rede jetzt nicht lange um den heißen brei und komme gleich zur sache 🙂

Mein Problem ist folgendes, ich habe ein Spiel Programmiert -es heist Shooter-, das mit der Zeit
relativ viele GuiBausteine, wie zB. JButton oder JRadiobuttons erhalten hat. Somit wurde das ganze ziemlich unübersichtlich, was zur Folge hatte das ich die ein oder andere notwenidge methode vergessen habe
( zB. das aufnehmen des Buttons auf das Panel oder es fehlte setVisible(true) oä. ) sodas es mich einige Nerven gekostet hat den Code nach solchen Fehlern zu durchsuchen.

Also habe ich mir überlegt, könnte ich mir nicht, ein Interface schreiben, das mich zwingt alle notwendigen Methoden für den jeweiligen Baustein zu deklarieren.

Leider bin ich damit nicht sehr weit gekommen 🙁

Hier ist mein Versuch:

--> Klasse Window
Java:
import javax.swing.*;
import java.awt.*;
import java.util.*;


public class Window extends JFrame {
	
	/**
	 * y-Range of the window
	 */
	int wHight = 600;
	/**
	 * x-Range of the window
	 */
	int wWidth = 600;
	/**
	 * x-Position of the window on desktop
	 */
	int wXPos = 200;
	/**
	 * y-Position of the window on desktop
	 */
	int wYPos = 200; 
	/**
	 * Name of the Window
	 */
	String wName = "Plotter";  
	
	
	
	
	
	public Window() {
	
		super();
		initWindowRanges(wWidth, wHight, wXPos , wYPos , wName);
		initGuiStones();
	}
	
	/**
	 * This method initializes the Ranges of the Window 
	 * 
	 * @param x
	 * @param y 
	 * @param xPos 
	 * @param yPos 
	 * @param name
	 * 
	 */
	public void initWindowRanges(int x , int y , int xPos , int yPos , String name){
		
		setTitle(name);
		setLocation(xPos, yPos);
		setSize(x, y);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

	/**
	 * This method initializes the gui-Stones ( eg. JButtons, JTextfields ) 
	 */
	public void initGuiStones(){
		
		JButton myButton = new JButton();
		
		GuiStoneButton initMyButton = new GuiStoneButton() {
			
			@Override
			public String setBtText(String text) {
				
				text = "Mach was";
				
				return text;
			}
			
			@Override
			public void setBtBounds(int breite, int hoehe, int xPos, int yPos) {
				
			}
			
			@Override
			public void addToPanel(JPanel panel) {
				
			}
			
			@Override
			public void addActionlistenerToButton() {
					
			}
		};
		
		
	}
	
	
}

--> Interface GuiStoneButton
Java:
import javax.swing.*;

/**
 * @author Cem
 * 
 * This interface make sure that you initialize your Button
 *
 */
public interface GuiStoneButton {
	
	public void setBtBounds( int breite, int hoehe, int xPos, int yPos );
	public String setBtText( String text );
	public void addToPanel( JPanel panel ); 
	public void addActionlistenerToButton( /* was hier rein kommen soll weis ich nicht */ );
		

}

Ich habe leider keine Ahung wie ich die beiden ( also das Interface und meine Instanz des Buttons) miteinander verknüpfen kann ???:L

Vielen dank schonmal im Vorraus 🙂
 
Also habe ich mir überlegt, könnte ich mir nicht, ein Interface schreiben, das mich zwingt alle notwendigen Methoden für den jeweiligen Baustein zu deklarieren.


So wie du dir das wahrscheinlich vorstellst geht das nicht.(/edit: okay, ginge evtl. doch irgendwie, aber macht den Code nur unnötig länger und unlesbar) -> Wieso schreibst du dir nicht einfach eine Methode initButton(....) oder so, der du eben alle notwendigen Parameter übergibst?
Oder du erstellst eine spezielle neue Klasse die JButton erweitert ...
 
Zuletzt bearbeitet:
Danke für die Tipps

Also die erste möglichkeit wäre doch ganz nett danke für die idee ich versuch sie mal zu realisieren ^^
Jetzt im nachhinein scheint es mir auch ziemlich aufwenidig die Sache mit einem Interface zu programmieren 🙂

Ich habe aber keine Ahung wie du das mit der speziellen klasse meinst ???:L

Ich mach mich jetzt mal ran an die Idee. Der Code wird sicherlich folgen damit jeder was davon hat 🙂

MfG Cem
 
Ich habe aber keine Ahung wie du das mit der speziellen klasse meinst ???:L

Irgendwie so zum Beispiel: (nach deinen Vorlagen *g*)

Java:
class GuiStone extends JButton implements ActionListener {

    //ob man hier wirklich unbedingt das panel übergeben muss?
    //sicher dass du setbounds benutzen willst? ;>
    public GuiStone(String text, JPanel panel, int... bounds) { //varargs evtl .ersetzen ^^
	this.setText(text);
	this.setBounds(bounds[0], bounds[1], bounds[2], bounds[3]);
	this.addActionListener(this);
	panel.add(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
	// ....
    }
}

Aufruf:
Java:
JButton button = new GuiStone("button1", panel, 10, 10, 50, 50);

Wenn die Buttons eh eig. alle die selbe Aufgaben haben, könnte man das so machen, ansonsten könnte man auch noch einen Parameter für den Listener hinzufügen oder so ^^ :autsch:
 
Zuletzt bearbeitet:
also ich hab jetzt mal

Java:
public void initButton(int breite, int hoehe,int xPos,int yPos, String text, JButton bt){
		
		int width = breite;
		int height = hoehe; 
		int x = xPos;
		int y = yPos; 
		String buttonsName = text;
		JButton button = bt;
		
		button.setBounds(x, y, width, height);
		button.setText(buttonsName);
		button.setVisible(true);
		add(btHallo);
		
	}

Java:
public Window() {
	
		super();
		initWindowRanges(wWidth, wHight, wXPos , wYPos , wName);
		initButton(100, 100, 200, 200, "Hallo", btHallo );
		
	}

Leider füllt jetzt der Button das gesamte fenster d.h. die setBounds bringen nichts warum weis ich nicht 🙁
 
Vielen dank für den tipp mit dem "null" ^^ jetzt gehts

die seite kenne ich schon hab mir da auch schon die eine oder andere information angeeignet 😉 thx

MfG Cem
 

Zurück
Oben