Swing: Panels verhalten sich bei vergrößern des Bildes nicht wie gewünscht.

rantanohneplan

Grünschnabel
Hallo!

Ich versuche gerade eine Swing-GUI mit dem GridBagLayout zu entwerfen. Ich habe das jetzt auch genauso hinbekommen wie ich es wollte. Allerdings bin ich dann über ein Problem gestolpert. Nach dem Laden des Programms sieht es gut aus. Wenn ich allerdings die Größe des Fensters ändere, dann verändert sich die Größe der Panels in die falsche Richtung. Ich habe ein paar Screenshots gemacht um das Problem zu verdeutlichen.

Bei dem Screenshot "orginal.png" handelt es sich um das Programm direkt nach dem Laden mit den richtigen Größen.
Der Screenshot "anderegröße.png" zeigt das Programm nach dem Verkleinern des Fensters. Wie man sieht sind der blaue und der grüne Bereich einfach im Nichts verschwunden und der schwarze und der weiße Bereich sind höher geworden. Dabei soll eigentlich alles einfach nur kleiner werden...

Hat jemand ne Idee wo der Fehler liegt?

Mein Code sieht wie folgt aus:
Code:
Container container;
  JPanel panel;
  GridBagConstraints cons;
  JMenuBar menubar;
  JMenu file;
  JPanel toolbar;
  JPanel navi;
  JPanel editor;
  JPanel buttons;
  JPanel statusbar;
  
  public PLConfiguratorFrame()
  { 
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    
    container = getContentPane();
    panel = new JPanel(new GridBagLayout());
    cons = new GridBagConstraints();
    
    menubar = new JMenuBar();
    file = new JMenu("File");
    menubar.add(file);
    setJMenuBar(menubar);
    
    toolbar = new JPanel();
    toolbar.setBackground(new Color(255, 255, 255));
    toolbar.setPreferredSize(new Dimension((int) (toolkit.getScreenSize().getWidth()), 
                                           (int) (toolkit.getScreenSize().getHeight()*0.05)));
    toolbar.setMinimumSize(new Dimension((int) (toolkit.getScreenSize().getWidth()), 
                                         (int) (toolkit.getScreenSize().getHeight()*0.05)));
    cons.fill = GridBagConstraints.HORIZONTAL;
    cons.gridx = 0;
    cons.gridy = 0;
    cons.gridwidth = 3;
    cons.gridheight = 1;
    panel.add(toolbar, cons);
    
    navi = new JPanel();
    navi.setBackground(new Color(0, 0, 0));
    navi.setPreferredSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.15), 
                                        (int) (toolkit.getScreenSize().getHeight()*0.85)));
    navi.setMinimumSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.15), 
                                      (int) (toolkit.getScreenSize().getHeight()*0.85)));
    cons.fill = GridBagConstraints.VERTICAL;
    cons.gridx = 0;
    cons.gridy = 1;
    cons.gridwidth = 1;
    cons.gridheight = 2;
    panel.add(navi, cons);
    
    editor = new JPanel();
    editor.setBackground(new Color(200, 0, 0));
    editor.setPreferredSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.85), 
                                          (int) (toolkit.getScreenSize().getHeight()*0.8)));
    editor.setMinimumSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.85), 
                                        (int) (toolkit.getScreenSize().getHeight()*0.8)));
    cons.fill = GridBagConstraints.HORIZONTAL;
    cons.gridx = 1;
    cons.gridy = 1;
    cons.gridwidth = 2;
    cons.gridheight = 1;
    panel.add(editor, cons);
    
    buttons = new JPanel();
    buttons.setBackground(new Color(0, 200, 0));
    buttons.setPreferredSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.85), 
                                           (int) (toolkit.getScreenSize().getHeight()*0.05)));
    buttons.setMinimumSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.85), 
                                         (int) (toolkit.getScreenSize().getHeight()*0.05)));
    cons.fill = GridBagConstraints.HORIZONTAL;
    cons.gridx = 1;
    cons.gridy = 2;
    cons.gridwidth = 2;
    cons.gridheight = 1;
    panel.add(buttons, cons);
    
    statusbar = new JPanel();
    statusbar.setBackground(new Color(0, 0, 200));
    statusbar.setPreferredSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.99), 
                                             (int) (toolkit.getScreenSize().getHeight()*0.03)));
    statusbar.setMinimumSize(new Dimension((int) (toolkit.getScreenSize().getWidth()*0.99), 
                                           (int) (toolkit.getScreenSize().getHeight()*0.03)));
    cons.fill = GridBagConstraints.HORIZONTAL;
    cons.gridx = 0;
    cons.gridy = 3;
    cons.gridwidth = 3;
    cons.gridheight = 1;
    panel.add(statusbar, cons);
    
    container.add(BorderLayout.CENTER, panel);
  }
 

Anhänge

  • orginal.jpg
    orginal.jpg
    12,5 KB · Aufrufe: 86
  • anderegröße.jpg
    anderegröße.jpg
    28 KB · Aufrufe: 85
Hi,
habe da mal Deinen Code oberflächlich angeschaut.
Es seiht so aus als wolltest Du für das ContentPane Container ein Borderlayout verwenden, hast aber diesem keines gegeben.
Du hast die Zeile
Code:
....
container.add(BorderLayout.CENTER, panel);
und das lies mich darauf schließen.
Jedoch bewirkt diese routine lediglich eine Benamung des panels welches Du in container hinzufügen möchstest.
Du soltest also 2 Dinge tun.
1. container ein borderlayout spendieren
2. container.add(panel, BorderLayout.CENTER); anstelle von container.add(BorderLayout.CENTER, panel);
verwenden. vielleicht klappt es ja dann.
 
Zuletzt bearbeitet:
hallo nochmal :-)
auf dem 2. Blick fällt mir auf, dass Du immer die selbe GirdBagConstraints benutzt und lediglich überschreibst. Ich bin mir nicht sicher ob das gut ist, Du solltest vielleicht stattdessen für jeden add in das Panel mit dem GridBagLayout ein eigenes GridBagConstraint-Object verwenden, vielleicht wird dies Deinem gewünschten Bild auch nach einem "Resize" besser nachkommen. Ich nehme an, dass nämlich ein Resize dann auf vielleicht nicht ganz consistente Informationen in Sachen Constraints stößt.
 
Vielen Dank für die Hilfe. Hab das alles soweit umgesetzt aber das hat dann noch nicht allzuviel geholfen. Was noch gefehlt hatte waren die Werte für weightx und weighty, mit denen man den Komponenten sagen kann, ob sie horizontal und vertikal resizable sind (0: nicht resizable, 100: voll resizable). Mit den Werten zwischen 0 und 100 kann man das ganze noch ein wenig staffeln.

Gruß,
Rantan
 
Zurück