Layout-Manager

Gut, das Hinzufügen in ein GridBagLayout hab ich jetzt hinbekommen...muss jetzt nur noch komplett alle Elemente dementsprechend "umbauen"...

auch die static habe ich entfernt...dachte halt, weil es dann überall sichtbar ist, dass ich dann einfach von überall auf wnd zugreifen kann, um es unsichtbar zu machen, windowslistener adden usw.
Mein Problem ist jetzt allerdings, dass ich eine Methode
Code:
static void beende_programm() {
	int response = JOptionPane.showConfirmDialog(null,"Programm" +
		" wirklich beenden ?","Programm beenden",
		JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
		if (response == 0){
			setVisible(false);
			dispose();
			System.exit(0);
		}
und diese muss static bleiben, weil ich noch ne Klasse MainMenu habe:
Code:
public class MainMenu extends MenuBar implements ActionListener {
public MenuItem m_item;
public Menu m;

public MainMenu(){
	m_item =  new MenuItem("Beenden");
	m_item.addActionListener(this);
	m = new Menu("Datei");;
	m.add(m_item);
	add(m);
}
public void actionPerformed(ActionEvent evt) {
	String cmd = evt.getActionCommand();  
	
	if (evt.getSource() == m_item){
		Schulungsunterlagenverwaltung.beende_programm();
	}
}
}
und die kann auf beende_programm nicht zugreifen, wenn die nicht static ist. Andersrum kann ich static auch nicht dort lassen,weil dann bei , setVisible(false);
und bei dispose(); die Fehler
The method dispose() from the type Schulungsunterlagenverwaltung is not static
stehen - ist wahrscheinlich diesmal echt nur ne Kleinigkeit, kannst du mir sagen, wie ich das löse?
 
Original geschrieben von philbo
Gut, das Hinzufügen in ein GridBagLayout hab ich jetzt hinbekommen...muss jetzt nur noch komplett alle Elemente dementsprechend "umbauen"...

auch die static habe ich entfernt...dachte halt, weil es dann überall sichtbar ist, dass ich dann einfach von überall auf wnd zugreifen kann, um es unsichtbar zu machen, windowslistener adden usw.
Mein Problem ist jetzt allerdings, dass ich eine Methode
Code:
static void beende_programm() {
	int response = JOptionPane.showConfirmDialog(null,"Programm" +
		" wirklich beenden ?","Programm beenden",
		JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
		if (response == 0){
			setVisible(false);
			dispose();
			System.exit(0);
		}

und diese muss static bleiben, weil ich noch ne Klasse MainMenu habe:
Code:
public class MainMenu extends MenuBar implements ActionListener {
public MenuItem m_item;
public Menu m;

public MainMenu(){
	m_item =  new MenuItem("Beenden");
	m_item.addActionListener(this);
	m = new Menu("Datei");;
	m.add(m_item);
	add(m);
}
public void actionPerformed(ActionEvent evt) {
	String cmd = evt.getActionCommand();  
	
	if (evt.getSource() == m_item){
		Schulungsunterlagenverwaltung.beende_programm();
	}
}
}

und die kann auf beende_programm nicht zugreifen, wenn die nicht static ist. Andersrum kann ich static auch nicht dort lassen,weil dann bei , setVisible(false);
und bei dispose(); die Fehler

stehen - ist wahrscheinlich diesmal echt nur ne Kleinigkeit, kannst du mir sagen, wie ich das löse?

Der Möglichkeiten gibt es immer mehrere.
1. Da eine MenuBar zu einem Frame gehört, ist eine eigene Klasse normal nicht nötig -> einfach die Funktionalität von MainMenu in die Hauptklasse legen.
2. Lass das dispose(); und setVisible(false); einfach weg, System.exit(0); genügt.
3. Du übergibst dem Konstruktor von MainMenu eine Referenz auf die Hauptklasse, deklarierst die beende_programm() als public void und rufst dann in der actionPerformed über die Referenz das beende_programm() auf. Voraussetzung ist natürlich, dass in MainMenu auch eine Variable bereitgestellt wird, die mit der im Konstruktor übergebenen Referenz gefüllt wird.
 
Super...danke! Hab den 2. Weg gewählt :)

Jetzt nochmal kurz zurück zum GridBagLayout:
Also, ich habe bisher 3 Komponenten, die ich hinzufüge:
Code:
GridBagLayout gbl = new GridBagLayout();
b_eingeben = new JToggleButton("neuen Datensatz eingeben");
b_eingeben.addActionListener(this);
addComponent(gbl, b_eingeben, 0, 0, 2, 1, 100, 100 );
b_suchaendern = new JToggleButton("Datensatz suchen/ändern");
b_suchaendern.addActionListener(this);
addComponent(gbl, b_suchaendern, 2, 0, 2, 1, 100, 100);
b_ende = new JButton("Programm beenden");
b_ende.addActionListener(this);
addComponent(gbl, b_ende, 3, 0, 2, 1, 100, 100)
Das heisst doch eigentlich, dass alle gleich groß sein müssten, oder? Allerdings sind die Buttons dann unterschiedlich groß, egal was ich als 5. und 6. Zahlenwert eintrage. Habe schon mehrere Werte getestet.

nochmal die Methode addComponent:
Code:
void addComponent(
        GridBagLayout gblayout,
        Component c,
        int x, int y,
        int width, int height,
        int weightx, int weighty )
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = x; gbc.gridy = y;
gbc.gridwidth = width; gbc.gridheight = height;
gbc.weightx = weightx; gbc.weighty = weighty;
gblayout.setConstraints( c, gbc );
getContentPane().add( c );
}
 
Original geschrieben von philbo

Jetzt nochmal kurz zurück zum GridBagLayout:
Also, ich habe bisher 3 Komponenten, die ich hinzufüge:
Code:
GridBagLayout gbl = new GridBagLayout();
b_eingeben = new JToggleButton("neuen Datensatz eingeben");
b_eingeben.addActionListener(this);
addComponent(gbl, b_eingeben, 0, 0, 2, 1, 100, 100 );
b_suchaendern = new JToggleButton("Datensatz suchen/ändern");
b_suchaendern.addActionListener(this);
addComponent(gbl, b_suchaendern, 2, 0, 2, 1, 100, 100);
b_ende = new JButton("Programm beenden");
b_ende.addActionListener(this);
addComponent(gbl, b_ende, 3, 0, 2, 1, 100, 100)
Das heisst doch eigentlich, dass alle gleich groß sein müssten, oder? Allerdings sind die Buttons dann unterschiedlich groß, egal was ich als 5. und 6. Zahlenwert eintrage. Habe schon mehrere Werte getestet.

Sollten gleich groß sein. Ist aber möglich/wahrscheinlich, dass zumindest die Breite abhängig vom Button-Text ist.

Mal ne Frage: Warum setzt Du die Breite auf 2 ?
 
Mal ne Frage: Warum setzt Du die Breite auf 2 ?
Gute Frage :-) Hatte keinen besonderen Grund, dachte erst, dass sie dann insgesamt etwas breiter werden, aber das stimmt ja nicht...
Übrigens wenn ich das GridBagLayout als
public static GridBagLayout gbl = new GridBagLayout(); deklariere, dann klappt das mit der Größe verändern, sonst nicht - komisch, oder?!

Wie kann ich es denn erreichen, dass die Buttons nicht direkt nebeneinander sind, sondern ein wenig Platz zwischen ihnen ist? Hatte es versucht, indem ich den Buttons die xy koordinaten 0,0 2,0 und 4,0 gebe, aber das klappt nicht.
 
Zuletzt bearbeitet:
Original geschrieben von philbo
Übrigens wenn ich das GridBagLayout als
public static GridBagLayout gbl = new GridBagLayout(); deklariere, dann klappt das mit der Größe verändern, sonst nicht - komisch, oder?!

Ich kenne nicht den ganzen Code, k.a.
Aber mir wird immer noch schlecht, weil Du offenbar immer noch mit static deklarierst.

Wie kann ich es denn erreichen, dass die Buttons nicht direkt nebeneinander sind, sondern ein wenig Platz zwischen ihnen ist? Hatte es versucht, indem ich den Buttons die xy koordinaten 0,0 2,0 und 4,0 gebe, aber das klappt nicht.

Dazu benötigst Du Insets.
Ich mache das z.B. immer so, wenn ich Komponenten einem Panel hinzufüge:
Code:
		myPanel.add(
			myButton,
			new GridBagConstraints(
				1,
				0,
				1,
				1,
				0.0,
				0.0,
				GridBagConstraints.CENTER,
				GridBagConstraints.NONE,
				new Insets(10, 10, 10, 10),
				0,
				0));
 
Aber mir wird immer noch schlecht, weil Du offenbar immer noch mit static deklarierst
Ja, konnte es doch entfernen, hab das Gridbaglayout einfach als globale Varibale deklariert, dann geht es, habe jetzt kein static mehr drin, außer bei beende_programm und bei main.

Danke wegen den Insets, habe das jetzt noch in meine Methode addComponent eingebaut, das klappt soweit alles.

Was ist denn die eleganteste Variante, um folgendes zu lösen:
Also, ich habe ja (wie gesagt) zuerst drei Buttons. Wenn ich einen dann anklicke, ändert sich der Fensterinhalt, die Buttons bleiben immer sichtbar, aber der Fensterinhalt darunter ändert sich laufend, wenn man eine Aktion ausführt.
Wenn ich jetzt das Fenster durch buttonklick vergrößere und in meinen Contentpane etwas hinzufüge, bzw herausnehme und durch andere elemente ersetze, ändert sich ja immer die Position der Button - ich glaube deshalb hatte ich mich auch zuerst fürs null-Layout entschieden, weil ich mit GridLayout etc keine Lösung gefunden hatte.

P.S.: Ist leider doch wieder so ein langer Thread geworden, sorry!
 
Original geschrieben von philbo

Was ist denn die eleganteste Variante, um folgendes zu lösen:
Also, ich habe ja (wie gesagt) zuerst drei Buttons. Wenn ich einen dann anklicke, ändert sich der Fensterinhalt, die Buttons bleiben immer sichtbar, aber der Fensterinhalt darunter ändert sich laufend, wenn man eine Aktion ausführt.
Wenn ich jetzt das Fenster durch buttonklick vergrößere und in meinen Contentpane etwas hinzufüge, bzw herausnehme und durch andere elemente ersetze, ändert sich ja immer die Position der Button - ich glaube deshalb hatte ich mich auch zuerst fürs null-Layout entschieden, weil ich mit GridLayout etc keine Lösung gefunden hatte.

P.S.: Ist leider doch wieder so ein langer Thread geworden, sorry!

- Erkläre mir genau, was Du unter Fenster/Fensterinhalt verstehst. Die komplette GUI? Einen Bereich oberhalb/unterhalb der Buttons? Was anderes? Ich verstehe weder das vorhandene noch das gewünschte Verhalten...
- Normalerweise ist es übersichtlich und einfach zu handeln - in Bezug auf Erweiterungen und Änderungen - wenn jede inhaltlich zusammengehörige (in erster Linie horizontale) Gruppe an Komponenten in ein eigenes Panel gelegt wird und die einzelnen Panels der contentPane hinzugefügt werden.
 
Erkläre mir genau, was Du unter Fenster/Fensterinhalt verstehst. Die komplette GUI?
Ja, genau - das (Haupt)fenster meiner Apllikation - besteht nur aus diesem einen Fenster, nur der Inhalt ändert sich.

Also, wie gesagt: die drei erwähnten Buttons sind am oberen Bildschirmrand zu sehen, und sollen da auch die ganze Zeit bleiben. Das Hauptfenster wird größer, sobald man einen Button geklickt hat und es werden weitere Komponenten (JLabel, JTextField bzw JTable) sichtbar bzw auch wieder unsichtbar.

Normalerweise ist es übersichtlich und einfach zu handeln - in Bezug auf Erweiterungen und Änderungen - wenn jede inhaltlich zusammengehörige (in erster Linie horizontale) Gruppe an Komponenten in ein eigenes Panel gelegt wird und die einzelnen Panels der contentPane hinzugefügt werden.

Also lege ich mir ein "Haupt"-JPanel an, und eins für meine Buttons und für die restlichen dinge und diese füge ich dann in das Hauptpanel ein?!
Richtig verstanden?

Gruß
Philipp
 
>Ja, genau - das (Haupt)fenster meiner Apllikation - besteht nur aus diesem einen Fenster, nur der Inhalt ändert sich.


Dann unterteile es. Buttons in ein Panel, Inhalt in ein weiteres.


>Also, wie gesagt: die drei erwähnten Buttons sind am oberen Bildschirmrand zu sehen, und sollen da auch die ganze Zeit bleiben. Das Hauptfenster wird größer, sobald man einen Button geklickt hat und es werden weitere Komponenten (JLabel, JTextField bzw JTable) sichtbar bzw auch wieder unsichtbar.


Diese weiteren Komponenten ebenfalls in ein eigenes Panel - vorausgesetzt sie sind nich in dem Button-Panel.


>Also lege ich mir ein "Haupt"-JPanel an, und eins für meine Buttons und für die restlichen dinge und diese füge ich dann in das Hauptpanel ein?!
>Richtig verstanden?
>Gruß
>Philipp


Jo. Aber achte auf die Verankerungen und Ausdehnungen.
Das Hauptpanel kann ruhig die ContentPane sein.
 
Zurück