# Layout-Manager



## philbo (23. Juni 2004)

Hallo...
ich habe zur Zeit meine Applikation komplett basierend auf dem Null-Layout, d.h. ich muss eben für jeden Button, jedes Label usw. mit setBounds angeben, wo sich das genau befinden soll. 
Ich habe bei mir einen "Startbildschirm" auf dem 3 Buttons zu sehen sind. (Datensatz anlegen, Datensatz suchen, Beenden), je nachdem welchen Button man klickt, werden die vorhandenen Objekte (Buttons etc) entfernt und die gewünschten geadded. 
Was gibt es denn für eine Möglichkeit, das etwas bequemer zu lösen? Das Problem ist eben auch, dass sich insgesamt mein Quelltext so sehr aufgebläht hat, dass es schon nicht mehr feierlich ist 
Habe für die wenigen Funktionen, die mein Programm bietet bereits 500 Zeilen Quelltext - das kanns ja wohl eigentlich nicht sein, oder?! 
Wie würdet ihr sowas aufbauen?

Gruß
Philipp

P.S.: @Snape keine Angst kriegen, das soll nicht wieder so ein Mammut-Thread werden, wie der letzte


----------



## Snape (23. Juni 2004)

> _Original geschrieben von philbo _
> *Hallo...
> ich habe zur Zeit meine Applikation komplett basierend auf dem Null-Layout, d.h. ich muss eben für jeden Button, jedes Label usw. mit setBounds angeben, wo sich das genau befinden soll.
> Ich habe bei mir einen "Startbildschirm" auf dem 3 Buttons zu sehen sind. (Datensatz anlegen, Datensatz suchen, Beenden), je nachdem welchen Button man klickt, werden die vorhandenen Objekte (Buttons etc) entfernt und die gewünschten geadded.
> ...



NullLayout... omg.... also wenn Du etwas anständiges nehmen willst, was man IMMER verwenden kann: GridBagLayout. Das ist vor allem am Anfang etwas schwierig zu durchschauen, aber wenn Du das einmal begriffen und öfter benutzt hast, wirst Du es zu schätzen wissen.
Ansonsten schaue Dir GridLayout und BorderLayout mal näher an, die kann man auch recht gut und oft einsetzen und sind einfacher von der Benutzung.

Ob das wieder ein Mammutthread wird, werden wir ja sehen...


----------



## philbo (23. Juni 2004)

Ok...ich schau es mir mal an...aber die Frage vorweg:
Kann ich da verschiedene Pane anlegen und die dann auf Buttonklick einfach nur anzeigen lassen, oder ist es besser, einen Pane zu verwenden und den zu leeren bzw zu füllen?


----------



## Thomas Darimont (23. Juni 2004)

Hallo!

Ja das kannst du und das ist IMHO die bessere Methode ...

Gruß Tom


----------



## philbo (23. Juni 2004)

Okay...einfach ist es echt nicht...bekomme gerade so einige Fehler angezeigt...
Also, ich habe jetzt die globalen Variablen 	Container c; GridBagLayout gbl;
Dann eine Methode 
	
	
	



```
static void addComponent( Container cont,
        GridBagLayout gbl,
        Component c,
        int x, int y,
        int width, int height,
        double weightx, double weighty )
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = x; gbc.gridy = y;
gbc.gridwidth = width; gbc.gridheight = height;
gbc.weightx = weightx; gbc.weighty = weighty;
gbl.setConstraints( c, gbc );
cont.add( c );
}
```

Meine main Methode sieht so aus...

```
public static void main(String[] args) {
	Schulungsunterlagenverwaltung wnd = new Schulungsunterlagenverwaltung();
   	Container c = wnd.getContentPane();
    GridBagLayout gbl = new GridBagLayout();
    c.setLayout( gbl );
	fenster(800,100); }
```
Die Methode Fenster, die aufgerufen wird:

```
static void fenster(int x,int y){
    WindowListener l = new WindowAdapter() {
    	public void windowClosing(WindowEvent e) {
    		int response = JOptionPane.showConfirmDialog(null,"Programm" +
    			" wirklich beenden ?","Programm beenden",
				JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
    		if (response == 0){
    			wnd.setVisible(false);
    			wnd.dispose();
    			System.exit(0);
    		}
    	}
    };
    Color farbe = new Color(204,204,204);
   	wnd.addWindowListener(l);
	wnd.setBackground(farbe);
    wnd.setLayout(null);
    wnd.setResizable(false);
    wnd.setSize(x,y);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    wnd.setLocation((d.width - wnd.getSize().width ) /2,(200));
    wnd.setVisible(true);
}
```

Wenn ich dann jetzt aus einer anderen Methode eine neue Komponente (z.b. einen JButton) adden will, mit dem Aufruf addComponent(c, gbl, b_eingeben, 0, 0, 2, 2, 1.0, 1.0 );

dann bekomme ich die Fehlermeldungen 





> java.lang.ExceptionInInitializerError
> Caused by: java.lang.NullPointerException
> at Schulungsunterlagenverwaltung.addComponent(Schulungsunterlagenverwaltung.java:96)
> at Schulungsunterlagenverwaltung.hauptfenster(Schulungsunterlagenverwaltung.java:81)
> ...



Hat da vielleicht jemand ne Idee, wo die Fehler/Probleme liegen


----------



## Snape (23. Juni 2004)

> _Original geschrieben von philbo _
> *Okay...einfach ist es echt nicht...bekomme gerade so einige Fehler angezeigt...
> Also, ich habe jetzt die globalen Variablen 	Container c; GridBagLayout gbl;
> Dann eine Methode *
> ...



Naja, was mag eine NullPointerException wohl bedeuten... 
gbc wird nicht NULL sein, weil gerade erst erzeugt, kann also höchstens sein, dass gbl und/oder cont NULL sind.

Übrigens gewöhn Dir mal an, nicht alle Funktionalität in die public static void main() zu legen oder generell in statischen Kontext.
Vor allem problematisch ist es, eine statische Variable genauso zu nennen wie einen Übergabeparameter (gbl).
Noch ein Tip: Benutze eine IDE wie Eclipse, sie zeigt die Stelle an, wo es kracht.


----------



## philbo (24. Juni 2004)

Also ich benutze ja Eclipse.


> gbc wird nicht NULL sein, weil gerade erst erzeugt, kann also höchstens sein, dass gbl und/oder cont NULL sind


ja...aber warum ist mir nicht klar.
Die Fehler zeigen auf :
gbl.setConstraints( c, gbc );
und auf:
addComponent(c, gblayout, b_eingeben, 0, 0, 2, 2, 1.0, 1.0 );



> Übrigens gewöhn Dir mal an, nicht alle Funktionalität in die public static void main() zu legen oder generell in statischen Kontext.


Hehe, ich bin immer froh wenn ich meine Vorstellungen irgendwie umgesetzt bekomme. Was MUSS denn unbedingt in der public static void main liegen?



> Vor allem problematisch ist es, eine statische Variable genauso zu nennen wie einen Übergabeparameter (gbl).


Ok, die hab ich schonmal umbenannt.


----------



## Snape (24. Juni 2004)

> _Original geschrieben von philbo _
> Also ich benutze ja Eclipse.
> 
> ja...aber warum ist mir nicht klar.
> ...


 
Na dann dürfte wohl klar sein, dass gbl NULL ist. Aber auch das zeigt Dir Eclipse an. Lass Dir doch vor der Ausführung der Zeile
gbl.setConstraints( c, gbc );
den Wert für gbl ausgeben.



> Hehe, ich bin immer froh wenn ich meine Vorstellungen irgendwie umgesetzt bekomme. Was MUSS denn unbedingt in der public static void main liegen?



Es reicht

MyClass myClass = new MyClass();

und ab dem Konstruktor von MyClass kann alles weitere geschehen, nicht-statisch ist dort wesentlich einfacher zu benutzen.
Oder wenn MyClass ein Frame ist dann eben noch ein

myClass.show();

Aber mehr muss es normalerweise nicht sein.


----------



## philbo (24. Juni 2004)

> Na dann dürfte wohl klar sein, dass gbl NULL ist. Aber auch das zeigt Dir Eclipse an. Lass Dir doch vor der Ausführung der Zeile
> gbl.setConstraints( c, gbc );
> den Wert für gbl ausgeben.


Stimmt, ist null

Wenn ich jetzt das 
	
	
	



```
Container c = wnd.getContentPane();
	GridBagLayout gbl = new GridBagLayout();
	c.setLayout( gbl );
```
 aus der main entferne und in meine Methode hinzufüge, wo der Button geadded werden soll, gibts nen Nullpointer-Fehler bei der ersten Zeile davon, obwohl wnd (ist die Instanz meiner Klasse, oder wie das heisst) public static ist.
Hab es dann mit Container c = this.getContentPane probiert, aber dann bekomme ich nen Fehler bei setLayout :


> java.lang.Error: Do not use Schulungsunterlagenverwaltung.setLayout() use Schulungsunterlagenverwaltung.getContentPane().setLayout() instead


Obwohl ich das doch so gesehen mache, oder?!


----------



## Snape (24. Juni 2004)

> _Original geschrieben von philbo _
> *Stimmt, ist null
> 
> Wenn ich jetzt das *
> ...



Du begehst einen riesen Denkfehler. Zuallererst: Entferne überall in Deinem Code das Wort static, ausser bei der main-Methode.
Diese reduzierst Du auf

```
public static void main(String[] args)
	{
		Schulungsunterlagenverwaltung wnd = new Schulungsunterlagenverwaltung();
		wnd.show();
	}
```

WICHTIG: *wnd* ist NUR in der main-Methode sichtbar (=vorhanden, benutzbar)  
Das heisst, dass eigentlich die Methode static void fenster(int x, int y) mit all den Zugriffen auf wnd gar nicht funktionieren kann - es sei denn, Du definierst sie noch an anderer Stelle als Instanzvariable.

Falls Du noch immer, also auch nach Änderungen anhand dieser Hinweise, Probleme haben sollteste, poste bitte den relevanten Teil, also main(), Konstruktor und Instanzvariablendeklarationen sowie die addComponent().


----------



## philbo (24. Juni 2004)

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 

```
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:

```
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?


----------



## Snape (24. Juni 2004)

> _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.
> ...



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.


----------



## philbo (24. Juni 2004)

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:

```
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:

```
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 );
}
```


----------



## Snape (24. Juni 2004)

> _Original geschrieben von philbo _
> 
> Jetzt nochmal kurz zurück zum GridBagLayout:
> Also, ich habe bisher 3 Komponenten, die ich hinzufüge:
> ...



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 ?


----------



## philbo (24. Juni 2004)

> 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.


----------



## Snape (24. Juni 2004)

> _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:

```
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));
```


----------



## philbo (24. Juni 2004)

> 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!


----------



## Snape (24. Juni 2004)

> _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.
> ...



- 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.


----------



## philbo (24. Juni 2004)

> 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


----------



## Snape (24. Juni 2004)

>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.


----------



## philbo (25. Juni 2004)

So ganz komme ich da irgendwie nicht weiter - alles ins getContentPane() zu adden ist kein Problem, allerdings dann ja (wie gesagt) ohne den gewünschten Erfolg - die Objekte verschieben sich.
Wenn ich es mit verschiedenen Panels versuche, dann klappt's nicht - hier mein Quelltext:

```
hauptpane = getContentPane();
Container cont = new Container();
b_eingeben = new JToggleButton("neuen Datensatz eingeben");
b_eingeben.addActionListener(this);
addComponent(cont, gbl, b_eingeben, 0, 0, 1, 1, 100, 100, 10, 10, 5, 5 );
b_suchaendern = new JToggleButton("Datensatz suchen/ändern");
b_suchaendern.addActionListener(this);
addComponent(cont, gbl, b_suchaendern, 1, 0, 1, 1, 100, 100, 10, 10, 5, 5);
bg = new ButtonGroup();
bg.add(b_eingeben); bg.add(b_suchaendern);
b_ende = new JButton("Programm beenden");
b_ende.addActionListener(this);
addComponent(cont, gbl, b_ende, 2, 0, 1, 1, 100, 100, 10, 10, 5, 5);
setContentPane(hauptpane);
hauptpane.setVisible(true);
hauptpane.add(cont);
```

und dazu dann die Methode addComponent():

```
void addComponent(Container container,
        GridBagLayout gblayout,
        Component c,
        int x, int y,
        int width, int height,
        int weightx, int weighty,
        int insleft, int insright,
        int instop, int insbottom )
{
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;
gbc.insets.left = insleft; gbc.insets.right = insright;
gbc.insets.top = instop; gbc.insets.bottom = insbottom;
gblayout.setConstraints( c, gbc );
container.add(c);
}
```

Ich hab irgendwie ein Problem, mit den verschiedenen Panes und Containern klazukommen bzw zu verstehen, was ich jetzt wo adden will/muss.

Kann mir dabei vielleicht nochmal jemand helfen? 
Das soll auch vorerst mein letztes Problem sein, denn dann ist mein kleines Programmchen erstmal soweit fertig und es kommen nur noch ein paar schönheitskorrekturen


----------



## Snape (25. Juni 2004)

> _Original geschrieben von philbo _
> So ganz komme ich da irgendwie nicht weiter - alles ins getContentPane() zu adden ist kein Problem, allerdings dann ja (wie gesagt) ohne den gewünschten Erfolg - die Objekte verschieben sich.
> Wenn ich es mit verschiedenen Panels versuche, dann klappt's nicht
> 
> ...



Das alles auszuführen beansprucht nun wirklich mehr Zeit als ich opfern kann.
Folgendes Vorgehensweise:
Pro Einheit ein eigenes Panel:

```
JPanel jpButtons = new JPanel(); // ein Panel für die Buttons
JPanel jpContents = new JPanel(); // ein Panel für den Inhalt
JPanel jpMisc = new JPanel(); // ein Panel für was weiss ich
```

Diese Panel fügst Du dem Gesantteil zu


```
add(
			jpButtons,
			new GridBagConstraints(
				0,
				0,
				1,
				1,
				1.0,
				0.0,
				GridBagConstraints.NORTHWEST,
				GridBagConstraints.HORIZONTAL,
				new Insets(0, 0, 0, 0),
				0,
				0));
add(
			jpContents,
			new GridBagConstraints(
				0,
				1,
				1,
				1,
				1.0,
				0.0,
				GridBagConstraints.NORTHWEST,
				GridBagConstraints.HORIZONTAL,
				new Insets(0, 0, 0, 0),
				0,
				0));
add(
			jpMisc,
			new GridBagConstraints(
				0,
				2,
				1,
				1,
				1.0,
				0.0,
				GridBagConstraints.NORTHWEST,
				GridBagConstraints.HORIZONTAL,
				new Insets(0, 0, 0, 0),
				0,
				0));
```

(Evtl. nicht direkt add sondern getContentPane().add)
So, und den einzelnen Panels fügst Du die Komponenten hinzu:

```
jpButtons.add(
			jbMyButton,
			new GridBagConstraints(
				0,
				0,
				1,
				1,
				1.0,
				0.0,
				GridBagConstraints.NORTHWEST,
				GridBagConstraints.HORIZONTAL,
				new Insets(0, 0, 0, 0),
				0,
				0));
```

usw.
Diese ganze Hampelei mit einer eigenen addComponent()-Methode würde ich einfach weglassen, sondern direkt hinzufügen/entfernen wie o.a.



> Das soll auch vorerst mein letztes Problem sein, denn dann ist mein kleines Programmchen erstmal soweit fertig und es kommen nur noch ein paar schönheitskorrekturen



"Nur noch" sind zwei ganz gefährliche Worte mit immensen Auswirkungen... 
Ausserdem weisst Du ja: 90% der Arbeit lässt sich in 10% der Zeit erledigen, für die restlichen 10% wird 90% der Zeit benötigt...


----------



## philbo (25. Juni 2004)

> Das alles auszuführen beansprucht nun wirklich mehr Zeit als ich opfern kann.


Näher auszuführen brauchst du das auch gar nicht, reicht so vollkommen...

Danke mal wieder.
Dann werde ich mich mal da ranmachen. Dachte mit der Addcomponent -Methode würde der Quelltext übersichtlicher werden, weil das in den Java-Büchern auch so beschrieben wird, aber es sind ja auch nur ein paar Zeichen, die man damit weniger tippt.

Oh man, dann hab ich ja noch 90% der Zeit vor mir  Nur blöd, dass ich "nur" noch 2 Wochen hier bin *g* 
Aber ich dachte schon ich hab jetzt nix mehr zu tun hier.

Ich habe übrigens das Problem, dass ich in meinem Betrieb, wo ich eigentlich Ausbildung mache (bin hier zur Zeit für 3 Monate zur "Verbundausbildung"), überhaupt nix mehr mit JAVA zu tun haben werde. Ich will aber nicht komplett den Faden verlieren, aber mir fehlen privat einfach Ideen, was ich denn anstellen könnte. Hast du vielleicht Tipps für mich, um am Ball zu bleiben?!

Gruß
Philipp


----------



## Snape (25. Juni 2004)

> _Original geschrieben von philbo _
> 
> Danke mal wieder.
> Dann werde ich mich mal da ranmachen. Dachte mit der Addcomponent -Methode würde der Quelltext übersichtlicher werden, weil das in den Java-Büchern auch so beschrieben wird, aber es sind ja auch nur ein paar Zeichen, die man damit weniger tippt.



Ich kenne einige Beispiele aus Büchern, die ...  suboptimal sind.



> Ich habe übrigens das Problem, dass ich in meinem Betrieb, wo ich eigentlich Ausbildung mache (bin hier zur Zeit für 3 Monate zur "Verbundausbildung"), überhaupt nix mehr mit JAVA zu tun haben werde. Ich will aber nicht komplett den Faden verlieren, aber mir fehlen privat einfach Ideen, was ich denn anstellen könnte. Hast du vielleicht Tipps für mich, um am Ball zu bleiben?!
> 
> Gruß
> Philipp



Ich würde Dir ja gerne mein OpenSource-Projekt anbieten, aber mir scheint, Deine Kenntnisse sind noch einiges zu dünn, um einzusteigen und produktiv mitzumachen.
Überleg Dir einfach ein (oder mehrere) Programm, erweitere es. Hast Du irgendein Hobby? Kannst Du dafür kein Programm schreiben? Oder für Eueren Verein irgendwas? Lass Dir was einfallen, lass Deiner Phantasie freien Lauf.


----------



## philbo (25. Juni 2004)

> Ich würde Dir ja gerne mein OpenSource-Projekt anbieten, aber mir scheint, Deine Kenntnisse sind noch einiges zu dünn, um einzusteigen und produktiv mitzumachen.


Das denke ich auch 



> Überleg Dir einfach ein (oder mehrere) Programm, erweitere es. Hast Du irgendein Hobby? Kannst Du dafür kein Programm schreiben? Oder für Eueren Verein irgendwas? Lass Dir was einfallen, lass Deiner Phantasie freien Lauf.



Hmm, na gut...mir wird schon von Zeit zu Zeit was einfallen, und wenn ich nur die Programme, die wir in der Schule in C++ schreiben, nochmal in Java schreibe.

Danke auf jeden Fall für die gute Hilfe hier im Forum!


----------

