Swing Grundlegende Frage zu SWING mit WindowBuilder

martin1989

Aktives Mitglied
Hallo!

Ich bin nun beim Erstellen meiner GUI mit SWING und habe mir auch schon einige Tutorials angeschaut.
Eine Frage bevor ich starte hätte ich noch und zwar wie realisiert man folgendes am besten mit dem Windows Builder:

Ich will ein Hauptfenster haben mit einer Menüleiste. Je nach ausgewählter Funktion soll der Inhalt der darunter dargestellt wird verschieden sein. Einmal will ich eine Tabelle darstellen und einmal nur eine Liste und einmal nur ein paar Buttons.

Muss ich hier nun für alle drei verschiedenen Darstellungsmöglichkeiten ein neues WindowsBuilder Projekt erstellen? Sonst zeichne ich ja quasi immer drüber oder wie läuft das mit dem WindowsBuilder? Ich beziehe mich hier auf die grafische Darstellung des WindowBuilder wo man ja seine GUI einfach zusammenklicken kann so wie man sie will. Ich habe mir eben ein JFrame erstellt, dann ein JPanel darübergelegt, ganz oben das Menü und in der mitte ein JTable. Wie erzeuge ich nun die anderen Darstellungsmöglichkeiten? Mit einem extra fenster das ich dann einfach aufrufe oder wie macht man das?

Vielen Dank und noch einen schönen Sonntag 🙂
 
Es gibt zwei Arten, wie ich dich verstehen kann und ich werde dir für beide Lösungen präsentieren:

1. Wenn du dir jetzt schon hundertprozentig sicher bist, dass du das Menü nicht ändern wirst, dann kannst du alles in eine Klasse tun. Wenn du es ändern möchtest, wäre Verteilen besser.

2. Guck dir mal das CardLayout an.


PS: Das Ding heißt WindowBuilder. Ohne "s" 😉
 
danke!

das mit dem card layout sieht schon ganz gut aus denke ich 🙂

Wenn ich das richtig verstanden habe, kann ich also eine "card" für jeweils einen fensterinhalt verwenden?
 
Zuletzt bearbeitet:
hehe perfekt danke!

Ich hab mir jetzt ne kleine gui gebaut, wo ich oben eine menüleiste habe und darunter ein panel wo zwei panels drinnen liegen. Jeweils mit einem button wo ich umschalten kann zwischen den zwei fenster:

Java:
JFrame frame = new JFrame("TestFenster");
	JPanel panelCont = new JPanel();
	JPanel panelOne = new JPanel();
	JPanel panelSecond = new JPanel();
	JButton buttonOne = new JButton("S");
	JButton buttonTwo = new JButton("S");
	CardLayout cl = new CardLayout();
	BorderLayout bl = new BorderLayout();
	private final JMenuBar menuBar = new JMenuBar();
	private final JMenu mnNewMenu = new JMenu("Start");
	private final JMenuItem mntmNewMenuItem = new JMenuItem("Öffnen...");
	
	public GUI()
	{
		
		
		panelCont.setLayout(cl); //
		
		panelOne.add(buttonOne);
		panelSecond.add(buttonTwo);
		panelOne.setBackground(Color.BLUE);
		panelSecond.setBackground(Color.GREEN);
		
		panelCont.add(panelOne, "1");
		panelCont.add(panelSecond, "2");
		cl.show(panelCont, "1");
		
		buttonOne.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				cl.show(panelCont, "2");
			}
		});
			
		
		buttonTwo.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				cl.show(panelCont, "1");
			  }
		});
		
		
		frame.getContentPane().add(panelCont, BorderLayout.CENTER);
		frame.setMinimumSize(new Dimension(800, 800));
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	
		frame.setVisible(true);
		frame.pack();
		frame.setSize(530,239);
		
		frame.setJMenuBar(menuBar);
		
		menuBar.add(mnNewMenu);
		mnNewMenu.add(mntmNewMenuItem);
		
	
	}
	
	
	public static void main(String[] args){
		SwingUtilities.invokeLater(new Runnable(){
	//
		public void run(){
			
			new GUI();
		}	});
	}
	
	}


bezüglich Struktur hätte ich noch eine Frage und zwar, soll ich jetzt alles in dieser Klasse GUI programmieren und kann ich das in andere Klassen auslagern? Ich würde jetzt gerne für die "unter panels" jeweils eine eigene oberfläche machen, also auf einer eine JTable anzeigen und auf der anderen was anders.

Übersichtshalber würde ich es schon besser finden wenn das in extrigen klassen gemacht wird aber ich weiss nicht wie man das so macht. und wie der window builder dann darauf reagiert?

Des weiteren wundert mich warum man dieses getContentPane braucht? Ist das so quasi die hauptpane die man nicht wegmachen kann?

Vielen Dank!
 
Zuletzt bearbeitet von einem Moderator:
Das kannst du in externen Klassen machen ja. Der WindowBuilder sollte damit keine Probleme machen wenn du die Panels richtig einbindest, letzlich macht der ja auch nichts anderes als dir Java Code zu generieren aus deinen Editor Einstellungen. Mit getContentPane wird das standard ContentPane des JFrames angesprochen. Braucht man ab Java5 nicht mehr explizit zu schreiben, die add Methode des JFrames ruft die Methode von selbst auf wenn man etwas hinzufügt.
 
ok danke! dann werde ich dies mit externen klassen versuchen um die übersicht zu wahren 🙂

wie würd ich das den machen, so

Code:
public class GUIOne extends JPanel {

	GUIOne panelCont = new GUIOne();
	
		
}

oder so

Code:
public class GUIOne {

	JPanel panelCont = new JPanel();
	

	
}

eher auf die zweite Variante oder?
 
Zuletzt bearbeitet:
Mit der Ersten würdest du eine Rekursion ohne Abbruchbedingung bauen, die in einem HeapSpaceError resultieren wird.

Wie du das machen solltest, hängt davon ab, was du machen möchtest.
Möchtest du gui.addComponent(card1) schreiben oder gui.addComponent(card1.getComponent())?
 
beim ersteren mache ich ja quasi eine klasse die sich wie JPanel verhählt (da extends).
Da ist die Pane ja selbst das objekt/die instanz.

Beim zweiten habe ich ja ein Objekt/Instanz mit den Attributen Pane, Button usw


Wenn ich das richtig verstehe?




Wie ich es schreibe ist mir eigentlich egal 🙂



Mein Problem was ich ein wenig habe ist, dass dies mein erstes Projekt mit SWING ist und ich mir nicht ganz sicher bin was gehört in welche Klasse bzw. wie muss ich das ganze aufbauen. Für was macht man eine eigene Klasse usw?
Ich hab mir zwar das MCV Framework angeschaut, auch in Verbindung mit SWING und versuche es schon an das angelehnt zu machen.
Aber ich bin mir eben nicht sicher was ich jetzt als Controller Klasse machen soll, was als Model und was als View Klasse.

so als richtiline hab ich mir vorgenommen die sachen was die ausgabe am bildschirm angegeht in "view" klassen zu packen, die sachen mit der benutzereingabe als "controller" klassen und daten verarbeiten als "model" klassen.

nur wie die ganzen zusammenspielen/kommunizieren .... eben der aufbau/die struktur so eines SWING GUI projektes ist mir nicht ganz klar. Weiß da jmd. vll eine hilfreiche Seite wo dies speziell behandelt wird?


Danke!
 
Du baust dir eine Klasse die von JPanel erbt, aber instanzierst die dort wo du sie brauchst.
Edit: Ich persönlich würde dir raten mit Swing per Hand anzufangen, lass den Builder weg. Damit du lernst wie was zusammenhängt usw. Bevor ich mir Gedanken über MVC etc machen würde, wäre es sinniger erstmal kleine Klassen zu schreiben und zu lernen wie die untereinander kommunizieren etc.
 
Zuletzt bearbeitet:
vielen dank für deine antwort! ich werde mir dies zu herzen nehmen.

könntest du mir vll noch einen kleinen denkanstoß/hinweis geben zur struktur/aufbau meines Programmes?

Also was ich immer wieder lese ist, trenne gui von den daten / datenverarbeitung.
Nun stellt sich für mich die frage was ist den nun der code der nur die gui behandelt?
Vermute mal, dass dies die ganzen swing befehle/methoden sind wie frame.pack / jpanel.add usw usw
Liege ich hier richtig?

Zum Aufbau meines Programmes:

Ich plane eine Oberfläche die drei verschiedene darstellungen hat (eine fixe menüleiste ganz oben, die immer gleich bleibt). Würde dies so aufbauen:

2-3 Klassen für das Dateneinlesen/aufbereitung und speicherung (nehme die daten aus einem xml file)
2-3 Klassen für Rechenmethoden die ich an diesen Daten vornehmen (sortieren, addieren, Kennzahlen bilden usw)

und jetzt weiß ich nicht mehr genau weiter?

für jedes jpanel eine klasse die nur die anordung und das design der gui beschreibt? (welcher button wo sitzt zB)

Und dann nochmal 2-3 Klassen für die Darstellung der Daten? Also das die daten dann an die gui sendet? Hier fehlen mir noch die Befehled dazu wie man das so macht?

Hat das ungefähr so Hand und Fuß oder würdest du mir einen anderen Aufbau empfehlen?


Vielen vielen Dank!
 
Das hat Hand und Fuß.
Grob würde uch es auch so machen.

GUI Code ist der Code, der das GUI darstellt. Also nicht die main Methode und auch nicht die Klasse, die das erste Objekt ds GUI erzeugt, sondern die Klassen, die beschreuben, wo ein Button ist und wo keiner ist.
 

Zurück
Oben