LayoutManager Layout reagiert nicht auf Constraints

Mino1337

Mitglied
Hallo,

Ich habe meinen Hauptframe mit dem GridBagLayout in 4 Fenster unterteilt und wollte nun per Buttonklick eines von diesen Fenstern (Panel b) in der größe ändern.
Das Funktioniert auch Wunderbar.
Wenn man den Button geklickt hat wird das Fenster klein, der Button auf den man geklickt hat wird entfernt und ein neuer Button mit anderer aufschrift wird an seiner stelle angezeigt.

Wenn man nun auf diesen klickt passiert garnichts. Allerdings sollte das Fenster wieder auf seine alte größe wachsen.

Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Hauptframe implements ActionListener{
   
   
    public static GridBagLayout layout = new GridBagLayout(); //Layout für den gesammten Frame
    public static GridBagConstraints cons;
    public static FlowLayout aLayout = new FlowLayout(FlowLayout.LEFT,5,5);
    public static JFrame f = new JFrame("Sammelfuchs");
   
    public static JPanel a = new JPanel();
    public static JPanel b = new JPanel();
    public static JPanel c = new JPanel();
    public static JPanel d = new JPanel();
   
    public static JButton sammlungenausblenden = new JButton( "Sammlungen ausblenden" );
    public static JButton sammlungeneinblenden = new JButton( "Sammlungen einblenden" );
    public static JButton neuesammlung = new JButton( "Neue Sammlung" );
   
   
   
    public Hauptframe(){
       
        a.setBackground(Color.red);
        b.setBackground(Color.yellow);
        c.setBackground(Color.blue);
        d.setBackground(Color.white);
       
        f.setMinimumSize(new Dimension(800, 600));
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Toolkit.getDefaultToolkit().setDynamicLayout(true);
        f.setLayout(layout);
        layoutset(0);
        menu();
       
        f.add(a);
        f.add(b);
        a.setLayout(aLayout);
        f.add(c);
        f.add(d);

        sammlungenausblenden.setActionCommand("sammlungenausblenden");
        sammlungenausblenden.addActionListener(this);
        sammlungeneinblenden.setActionCommand("sammlungeneinblenden");
        sammlungenausblenden.addActionListener(this);
       
        buttons(0);
       
        f.validate();
       
   
    }
   
    //Stellt sie Constraints ein
    public static void layerdim(Component a,GridBagLayout c,int gridx, int gridy, int gridwith, int gridheight,int ipadx,int ipady, double weightx, double weighty, int s, int anchor){
        cons = new GridBagConstraints();     //Bereinigung der Constrains (Alles auf Null setzen weil neu)
        cons.gridx = gridx;                 //In welcher Spalte startet das Objekt
        cons.gridy = gridy;                 //in welcher Zeile endet das Objekt
        cons.gridwidth = gridwith;            //Wieviele Spalten nimmt das Objekt ein
        cons.gridheight = gridheight;         //Wieviele Zeilen nimmt das Objekt ein
        cons.ipadx = ipadx;                 //Wie Breit ist das Objekt Mindestens
        cons.ipady = ipady;                 //Wie Hoch ist das Objekt Mindestens
        cons.weightx = weightx;             //Prozentualer Wert der Breite
        cons.weighty = weighty;             //Prozentualer Wert der Höhe
       
        if(s==0){
            cons.fill = GridBagConstraints.NONE;        //Das Objekt wird nur so gross in seinen Bereich angezeigt wie es ist
        }else if(s==1){
            cons.fill = GridBagConstraints.HORIZONTAL;    //Das Objekt füllt den gesammten Raum Horizontal
        }else if(s==2){
            cons.fill = GridBagConstraints.VERTICAL;    //Das Objekt füllt den gesammten Raum Vertikal
        }else if(s==3){
            cons.fill = GridBagConstraints.BOTH;        //Das Objekt füllt den gesammten Raum Horizontal und Vertikal
        }
       
        if(anchor==0){
            cons.anchor = GridBagConstraints.CENTER;
        }else if(anchor==1){
            cons.anchor = GridBagConstraints.NORTH;
        }else if(anchor==2){
            cons.anchor = GridBagConstraints.EAST;
        }else if(anchor==3){
            cons.anchor = GridBagConstraints.WEST;
        }else if(anchor==4){
            cons.anchor = GridBagConstraints.SOUTH;
        }else if(anchor==5){
            cons.anchor = GridBagConstraints.SOUTHEAST;
        }else if(anchor==6){
            cons.anchor = GridBagConstraints.NORTHEAST;
        }else if(anchor==7){
            cons.anchor = GridBagConstraints.SOUTHWEST;
        }else if(anchor==8){
            cons.anchor = GridBagConstraints.NORTHWEST;
        }
       
        c.setConstraints(a,cons);   
    }
   
    public void menu(){
       
        JMenuBar menuBar = new JMenuBar();
       
        JMenu neu = new JMenu( "Neu" );
        menuBar.add( neu );
        neu.add(new JMenuItem("Sammlung"));
        neu.add(new JMenuItem("Eintrag"));
       
        JMenu ansicht = new JMenu( "Ansicht" );
        menuBar.add( ansicht );
        ansicht.add(new JCheckBoxMenuItem("Sammlungen einblenden"));
       
        JMenu hilfe = new JMenu( "Hilfe" );
        menuBar.add( hilfe );
       
        JMenu ueber = new JMenu( "Über" );
        menuBar.add( ueber );
       
        f.setJMenuBar( menuBar );
    }
   
   
    //Korrigiert das Layout nach Buttonklick
    public void layoutset(int x){
        if(x==0){
            layerdim(a,layout,0,0,2,1,1,0,0.0,0.0,3,0);
            layerdim(b,layout,0,1,1,1,200,0,0.0,1.0,3,0);
            layerdim(c,layout,1,1,1,1,1,1,1.0,0.1,3,0);
            layerdim(d,layout,0,3,2,1,1,20,1.0,0.0,3,0);
            f.validate();
            f.repaint();
        }else if(x==1){
            layerdim(b,layout,0,1,1,1,0,0,0.0,1.0,3,0);
            f.validate();
            f.repaint();

        }
    }
   
    //Ordnet nach Buttonklick die Buttons in Panel a neu an und tauscht sie aus
    public void buttons(int x){
        if(x==0){
            a.removeAll();
            a.add(sammlungenausblenden);
            a.add(neuesammlung);
            a.validate();
            f.repaint();
        }else if(x==1){
            a.removeAll();
            a.add(sammlungeneinblenden);
            a.add(neuesammlung);
            a.validate();
            f.repaint();
        }
    }
   
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("sammlungeneinblenden")){
            buttons(0);
            layoutset(0);
        }else if(e.getActionCommand().equals("sammlungenausblenden")){
            buttons(1);
            layoutset(1);
        }

             }
   
}

Das ist bis auf die Main methode der gesammte Code. Die Main Methode erzeugt bisher nur ein Objekt dieser Klasse.

Vielen Dank für eure Hilfe.
 
Zunächstmal ist mir das "Toolkit.getDefaultToolkit().setDynamicLayout(true)" aufgefallen. Das habe ich noch nirgendwo gesehen. Laut API Doku hat das was mit dynamischen Layout Anpassungen bei z.B. Resize von Containern zu tun. Da steht auch, dass man das mit "Toolkit.getDefaultToolkit().getDesktopProperty("awt.dynamicLayoutSupported")" abfragen kann. Hab ich mal gemacht ohne die Zeile "setDynamicLayout(true)". Kommt sowieso "true" zurück. Ist also vermutlich nicht nötig das explizit auf "true" zu setzen... Ich schreibe "vermutlich", da ich nicht genau weiss was das "setDynamicLayout" überhaupt macht. Ich habe es bisher halt nie gebraucht.

Soviel dazu. Hat mit deinem Problem nichts zu tun.

Du hast lediglich hier:

sammlungenausblenden.setActionCommand("sammlungenausblenden");
sammlungenausblenden.addActionListener(this);
sammlungeneinblenden.setActionCommand("sammlungeneinblenden");
sammlungenausblenden.addActionListener(this); <---

sammlungenausblenden statt sammlungeneinblenden geschrieben.
 
OMG Wie Peinlich D= ... Ich hab gestern explizit nach so einem Fehler gesucht aber keinen gefunden XD ...

Vielen Dank das wär mir nich aufgefallen, ich sollte meine Buttons anders benennen.

Ich habe gelesen das manche Layouts bei größenveränderungen des Frames erst mit loslassen der Maustaste refreshen. Dort wo ich das gelesen habe stand aber nicht welche Layoutmanager dies sind. Weswegen ich vorsichtshalber, da ich zu diesem Zeitpunkt das Problem durch einen anderen Fehler hatte, die Toolkit.getDefaultToolkit().setDynamicLayout(true) gesetzt habe =D ...

Ich denke ich nehm sie wieder raus.

Nochmal Dankeschön =)
 
Kein Problem 🙂

Wie gesagt, ich hab das setDynamicLayout(true) noch nie vorher gesehen. Weiss also nicht, ob man es weglassen sollte oder nicht. Ich weiss nur, dass bisher meine (kleinen) GUIs immer so reagiert haben, wie ich es wollte. Also ohne das setDynamicLayout. Vielleicht weiss ja hier irgendwer mehr über diese mysteriöse Zeile 😉
 
Naja ich weiss schon mehr nur nicht alles darüber =D ... Welcher Layoutmanager das annimmt weiss ich leider nicht. Aber ich weiss das manche Layoutmanager eben nicht Dynamisch bei Framegrößenveränderungen reagieren.

Funktionierte übrigens auch ohne setDynamicLayout(true) ...
 

Neue Themen


Zurück
Oben