Buttons werden nebeneinander angeordnet

Django1337

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

rn5wygqvyf.png


FENSTER GROß:

52rzvzu3yvi.png


QUELLCODE:

Java:
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.
 
Zuletzt bearbeitet von einem Moderator:
"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 :/

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


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

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).
 
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?
 
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?!

Java:
        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);

hast du dein JPanel (hier window) auch geadded?

Jap.
 
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:
Java:
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);
 
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.
 
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
 

Zurück
Oben