LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander.

ConzT

Mitglied
Hi Leute,

da ich für die Uni bis Ende nächstes Semester ein Programm(Graphentheorie) mit GUI programmieren müssen und wir GUI's bis jetzt noch gelernt haben habe ich vorgestern beschlossen mir Swing mal selbst näher zu bringen... Läuft bis jetzt nicht so schlecht und macht Spaß 🙂 Zumindest kann ich meine Matritzen so darstellen wie ich es mir vorstelle(Naja Größe werde ich noch anpassen).

Ich habe nun ein Problem bei mehreren JPanels in einem Frame.

Ich verwende für die Darstellung der Komponenten den LayoutManager GridBagLayout.
Die Matritzen erstelle ich in einem JPanel(JToggleButtons in einem GridLayout) und positioniere eine Links Oben im Eck(FIRST_LINE_START) , die Zweite in der Mitte(PAGE_START) und die dritte rechts oben im Eck(FIRST_LINE_END).

Für die Ausgabe diverser Berechnungen habe ich unten(PAGE_END / Horizontal(damit sie sich über die ganze Breite streckt) noch eine JTextArea.


Mein Problem nun. Wenn ich das Fenster verkleinere, werden die Matritzen in der Mitte und die rechts oben im Eck unter die Matritze im linken oberen Eck geschoben. Dies würde ich gerne verhindern.
Die JTextArea verschiebt sich über die Matritzen wenn ich das Fenster nach obenhin verkleinere.

Siehe Screenshots...


Habe zwar googel gefragt aber nicht annähernd einen Lösungsansatz gefunden. Evtl. sollte ich das auch noch lernen ;-)

Wäre super wenn ihr mir helfen könnt wie ich das Problem löse(Keine ganze Lösung sondern einen Ansatz oder wonach ich googeln soll ;-) )



Anbei der Code der Methode in der ich das Layout zusammenbastle und ein paar Screenshots:

Danke schon Mal!


Ps1: Screenshots muss ich erst online laden, kommen gleich
Ps2: Gerne auch Kritik zur Struktur des Codes gewünscht(Da fehlts mir noch bisschen an sinvollem und "schönem" aufbau ;-)

Code:
public void init(int dimension, int[][] array) {
            JFrame frame = new JFrame("Graph Program v.0.1.2");
            menubar = new JMenuBar();
            menu= new JMenu("Menü");
            menubar.add(menu);
            frame.setJMenuBar(menubar);
          
          
            GridBagConstraints c = new GridBagConstraints();
            frame.getContentPane().setLayout(new GridBagLayout());
          
            //Größe des Frames berechnen und festlegen
            t = Toolkit.getDefaultToolkit();
            Dimension d = t.getScreenSize();
            int height = (int) d.getHeight()-30;
            int width = (int) d.getWidth();
          
            frame.setSize(width, height);
            //Init Container und panel für Adjazenzmatrix erstellen
            inhalt = frame.getContentPane();
            inhalt.setBackground(Color.DARK_GRAY);
          
          
          
          
            // Panel, adjazenzmatrix dem Container hinzufügen und positionieren
            JPanel p = new JPanel();
            p = createGridPanelAdjazenzmatrice(dimension, array);
            c.anchor = GridBagConstraints.FIRST_LINE_START;
            c.gridx = 0;
            c.gridy = 0;
            c.weightx = 1;
            c.weighty = 1;
            inhalt.add(p, c);
          
            //Panel, wegmatrix dem Container hinzufuegen und positionieren
          
            JPanel p2 = new JPanel();
            p2 = createGridPanelWaymatrice(dimension, array);
            c.anchor = GridBagConstraints.PAGE_START;
            c.gridx = 0;
            c.gridy = 0;
            c.weightx = 1;
            c.weighty = 1;
            inhalt.add(p2, c);
          
            JPanel p3 = new JPanel();
            p3 = createGridPanelDistancematrix(dimension, array);
          
            c.anchor = GridBagConstraints.FIRST_LINE_END;
            c.gridx = 0;
            c.gridy = 0;
            c.weightx = 1;
            c.weighty = 1;
            inhalt.add(p3, c);
          
            //TextFenster erstellen und einbinden
            JPanel p4 = new JPanel();
            p4.setLayout(new BorderLayout());
            c.gridwidth = GridBagConstraints.RELATIVE;
            c.fill = GridBagConstraints.HORIZONTAL;
            c.gridx = 0;
            c.gridy = 5;
            c.weightx = 0;
            c.weighty = 0;
            c.ipady = 500;
          
          
            textWindow = new JTextArea();
            textWindow.setBorder(new LineBorder(Color.GREEN));
            scrollpane = new JScrollPane(textWindow);
            scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
            scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            p4.add(scrollpane,BorderLayout.CENTER);
            inhalt.add(p4,c);
          
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }


snap20160201ty2snci68h.png


snap20160201z18s5itno0.png



snap20160201y7e68mpxk0.png
 
Sich evtl. mit einem besseren (subjektiv) LayoutManager anfreunden? 🙂
Kann das hier (JGoodies) empfehlen, da die von JDK angeboteten mir so gar nicht gefallen. ^^
Library kann über das MVN Repo bezogen werden.

viele Grüße
Steven
 
Hab nur drübergeschaut. Aber ich sehe da nirgens eine Angabe vom anchor PAGE_END. Vielleicht hilft das ja schon.
Danke für eure Tipps! Den anchor habe ich der TextArea hinzugefügt, ändert sich aber nichts an der darstellung :/

@ Steven, Das wäre natürlich auch ne Möglichkeit. Werde es mir mal ansehen! Habe halt die von JDK angeboteten zuerst gefunden^^
 
Das GridBagLayout hat allerdings auch ein Grid System. Du schiebst aber deine Panels alle an dieselbe Koordinate. Darum schieben sie sich übereinander beim Verkleinern. Wenn du das verhindern möchtest, musst du einfach jedes Panel in seine eigene Koordinate packen. gridx=0, gridx=1, gridx=2.
Dann kann man weiter mit den weightx/y spielen. Wenn ich mich recht erinnere, regelt dieser Wert , wer wieviel des vorhandenen Platzes bekommt. weightx=0.3 wären dann z.B. 30%. Man möge mich verbessern, wenn das falsch ist.

Wie wäre das hier?
Code:
public void init(int dimension, int[][] array) {
    JFrame frame = new JFrame("Graph Program v.0.1.2");
    JMenuBar menubar = new JMenuBar();
    JMenu menu = new JMenu("Menü");
    menubar.add(menu);
    frame.setJMenuBar(menubar);
 
 
    GridBagConstraints c = new GridBagConstraints();
    frame.getContentPane().setLayout(new GridBagLayout());
 
    //Größe des Frames berechnen und festlegen
    Toolkit t = Toolkit.getDefaultToolkit();
    Dimension d = t.getScreenSize();
    int height = (int) d.getHeight()-30;
    int width = (int) d.getWidth();
 
    frame.setSize(width, height);
    //Init Container und panel für Adjazenzmatrix erstellen
    Container inhalt = frame.getContentPane();
    inhalt.setBackground(Color.DARK_GRAY);
 
 
 
 
    // Panel, adjazenzmatrix dem Container hinzufügen und positionieren
    JPanel p = new JPanel();
    p = createGridPanelAdjazenzmatrice(dimension, array);
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.3;
    c.weighty = 0.3;
    inhalt.add(p, c);
 
    //Panel, wegmatrix dem Container hinzufuegen und positionieren
 
    JPanel p2 = new JPanel();
    p2 = createGridPanelWaymatrice(dimension, array);
    c.gridx = 1;
    c.gridy = 0;
    c.weightx = 0.3;
    c.weighty = 0.3;
    inhalt.add(p2, c);
 
    JPanel p3 = new JPanel();
    p3 = createGridPanelDistancematrix(dimension, array);
    c.gridx = 2;
    c.gridy = 0;
    c.weightx = 0.3;
    c.weighty = 0.3;
    inhalt.add(p3, c);
 
    //TextFenster erstellen und einbinden
    JPanel p4 = new JPanel();
    p4.setLayout(new BorderLayout());
    c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.gridx = 0;
    c.gridy = 1;
    c.weightx = 1;
    c.weighty = 0.7;
 
 
    JTextArea textWindow = new JTextArea();
    textWindow.setBorder(new LineBorder(Color.GREEN));
    JScrollPane scrollpane = new JScrollPane(textWindow);
    scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    p4.add(scrollpane,BorderLayout.CENTER);
    inhalt.add(p4,c);
 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
 
@X5-599 Super danke dir, genau so hab ich es mir vorgestellt! 🙂 Hab mich gestern abend dann auch noch damit gespielt und es auch so hinbekommen, das einzige problem war, dass ich die TextArea nicht auf gridwith 3 hatte und somit war sie horizontal gestreckt, das Problem hat ich nun auch erledigt 🙂


Weißt du zufällig auch wie ich die Farbe der Schrift der mittleren und rechten Matrix ändern kann?

Bei der ganz linken Matrix habe ich das mit setForground() geschafft. Bei den anderen beiden funktioniert dies aber nicht. Vermute das liegt daran, dass es JToggleButtons sind die nicht aktiv sind(setEnabled(false)) ?
 
Kann ich dir leider nicht sagen. Ist aber gut möglich, daß das daran liegt (setEnabled(false)). Vielleich ließe sich sowas über das jeweilige LookAndFeel ändern... Kenne mich da aber auch nicht mehr wirklich gut aus.
 

Neue Themen


Zurück
Oben