# Buttons werden nebeneinander angeordnet



## Django1337 (14. Aug 2015)

Ich spiele grad wieder einwenig mit eclipse und Java rum.

Vor kurzem habe ich schonmal damit rumgespielt da ging irgendwie noch alles und jetzt spiele ich wieder damit und komischerweise werden meine Buttons jetzt immer - wenn ich das Fenster groß mache - nebeneinander statt untereinander angezeigt.

Starte ich dass erste Mal das Programm sieht alles gut aus, aber wie gesagt, einmal Bild groß gemacht und schon stehen die Buttons nebeneinander. Selbst wenn ich das Fenster wieder klein mache.

Ich weiß absolut nicht mehr was ich beim letzten Mal anders gemacht habe :/

FENSTER KLEIN:







FENSTER GROß:






QUELLCODE:


```
import java.awt.Color;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Start {

   public static void main (String args[]){
    
     String app_title = "Klickprogramm V.1.0";
    
     JFrame window = new JFrame (app_title);
     window.setSize(900,900);
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     window.setLocationRelativeTo(null);
     window.setVisible(true);
    
    
     JPanel buttons = new JPanel();
     window.add(buttons);
  
     JButton test = new JButton ("TEST");
     test.setBounds(5, 5, 100, 20);
     buttons.add(test);

     JButton test1 = new JButton ("TEST1");
     test1.setBounds(5,30,100,20);
     buttons.add(test1);
    
     JButton test2 = new JButton ("TEST1");
     test2.setBounds(5,55,100,20);
     buttons.add(test2);
    
  }
}
```

Ich wollte eigentlich die Buttons usw wieder auf ein Pane legen, dass ich - wenn ich die Buttons verschieben sollte - dass ganze Pane verschieben kann und gut.

Aber wie gesagt, in erster Linie geht es um die Buttons die irgendwie nicht da bleiben wo sie sollen.


----------



## Flown (14. Aug 2015)

Wie sollen die Buttons angeordnet sein? Immer untereinander? Dann verwende doch ein BoxLayout


----------



## JStein52 (15. Aug 2015)

Und standardmässig besitzt jedes JPanel ein FlowLayout als LayoutManager, also auch bei dir.


----------



## Django1337 (15. Aug 2015)

"Meistens" werden Sie untereinander angeordnet. Ich gehe mal davon aus dass wenn ich welche "neben" die anderen setzen möchte, ein BoxLayout daneben setzen muss?!

Ich meine ich hätte damals bei rumspielen auch das FlowLayout genutzt gehabt,
und dann halt per "setBounds" angegeben wo die Buttons usw. sitzen sollen.

Wenn ich jetzt mal testweise folgendes eintippe, sehe ich nichts außer ein Fenster :/


```
JPanel window = new JPanel ();
        window.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS));
        window.setVisible(true);
        
        window.add(new JButton ("Start"));
        window.add(new JButton ("Start1"));
        window.add(new JButton ("Start2"));
```

Die drei Buttons werden nicht angezeigt.


----------



## Puppetmaster (15. Aug 2015)

Django1337 hat gesagt.:


> Ich spiele grad wieder einwenig mit eclipse und Java rum.
> 
> Starte ich dass erste Mal das Programm sieht alles gut aus, aber wie gesagt, einmal Bild groß gemacht und schon stehen die Buttons nebeneinander. Selbst wenn ich das Fenster wieder klein mache.
> 
> Ich weiß absolut nicht mehr was ich beim letzten Mal anders gemacht habe :/



Ursache des Problemes ist, das beim Ändern der Fenstergröße der Layoutmanager die Buttons neu anordnet. Da in der Standardeinstellung ein Flowlayout aktiv ist, werden deine Buttons nebeneinander angeordnet.

Es könnte helfen den Layoutmanager für das JPanel auf null zu setzen. Aber selbst dann kann es evtl. noch zu Problemen führen wenn man die Fenstergröße ändert.




Django1337 hat gesagt.:


> ```
> JPanel window = new JPanel ();
> window.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS));
> window.setVisible(true);
> ...



Es sieht so aus als versuchst du das JPanel window direkt anzuzeigen ohne ein übergeordnetes Element. Das kann so nicht funktionieren. Das oberste Element muss immer ein Container sein, der die Klasse RootPaneContainer implementiert (wie z.B. JFrame, JDialog oder JWindow).


----------



## javampir (15. Aug 2015)

bei so was würde ich aber vom null layout abraten. wenn du etwas untereinander und mit gleicher breite haben möchtest könnte auch eine Box mit BoxLayout helfen.
wenn du ein fenster siehst wo nix drin ist: hast du dein JPanel (hier window) auch geadded?


----------



## Django1337 (18. Aug 2015)

Puppetmaster hat gesagt.:


> Das oberste Element muss immer ein Container sein, der die Klasse RootPaneContainer implementiert (wie z.B. JFrame, JDialog oder JWindow).



Ich denke so sollte es richtig sein um etwas anezeigt zu bekommen,oder nicht?!


```
JFrame window = new JFrame (app_title);
        window.setSize(800,800);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLayout(null);
        window.setLocationRelativeTo(null);
        window.setVisible(true);
       
        JPanel window_pane = new JPanel();
        window_pane.setLayout(new BoxLayout(window, BoxLayout.Y_AXIS));
        window_pane.setVisible(true);
               
        window_pane.add(new JButton ("Start"));
        window_pane.add(new JButton ("Start1"));
        window_pane.add(new JButton ("Start2"));

        window.add(window_pane);
```



javampir hat gesagt.:


> hast du dein JPanel (hier window) auch geadded?



Jap.


----------



## javampir (18. Aug 2015)

also...
1. das frame sollte man immer als letztes visible setzen.
2. window.setLocationRelativeTo(null); kann man sich schenken
3. window.setLayout(null); würd ich nicht machen; das stardard Borderlyout passt doch hier ganz gut
4. ich krieg nen compilerfehler, BoxLyout cannot be shared. ich wür Box hernehmen.
5. ein JPanel braucht man nicht visible setzen

insgesamt also so:

```
JFrame window = new JFrame (app_title);
window.setSize(800,800);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Box window_pane = new Box(BoxLayout.Y_AXIS);
window_pane.add(new JButton ("Start"));
window_pane.add(new JButton ("Start1"));
window_pane.add(new JButton ("Start2"));
window.add(window_pane);
window.setVisible(true);
```


----------



## Django1337 (19. Aug 2015)

Ich weiß nicht, irgendwie nicht so richtig dass was ich wollte. Wie gesagt, damals hatte ich alle Buttons, Labels usw. über *.setBounds positioniert.

Hier (bei Box etc.) scheint es nicht zu funktionieren, oder sehe ich dass falsch?

Des Weiteren ist es so, dass die Buttons "direkt" (also ohne Freiraum) untereinander bzw. aneinander liegen.


----------



## javampir (19. Aug 2015)

setBounds muss man nur manuell machen, wenn kein layoutmanager verwendet wird, sonst macht der das für dich. für freiraum kannst du leere objekte einfügen.
alternative zu box: panel mit gridlayout, da kannst du dann direkt hgap und vgap einstellen


----------

