LayoutManager Probleme mit Positionierung/Abständen der Komponenten

handoffate

Mitglied
Hallo liebe Community,
da ich sehr häufig bei der Erstellung von GUIs meine Probleme habe, beschleicht mich doch das Gefühl, dass ich bei der Verwendung der verschiedenen LayoutManager etwas grundlegend falsch verstehe. Daher hoffe ich auf ein wenig generelle Hilfe an einem konkreten Beispiel/Problem mit der Bitte auf Hinweise, was ich hier grundsätzlich falsch mache bzw. warum die GUI so angezeigt wird, wie sie angezeigt wird :confused:

Also zum konkreten Projekt: Ich verwende ein JFrame auf welchem als grundlegender LayoutManager ein BorderLayout zum Einsatz kommt. Im Center-Part befinden sich die meisten Komponenten (und werden sogar so angezeigt, wie ich das will :)). Der LineEnd-Part enthält ein Panel (welches im konkreten Projekt wahlweise angezeigt wird oder auch nicht). Hier sollen neben ein paar Buttons in gitterförmiger Struktur JSpinner angezeigt werden. Die Wahl fiel auf ein GridLayout. Aufgebaut habe ich das mit dem unten stehenden Quelltext..
Das Problem: Zwischen den Buttons (oben) und den JSpinnern (unten) befindet sich ein so großer Abstand, dass die Spinner nicht mehr passen und auch zu klein dargestellt werden (siehe auch Bild).. Hier frage ich mich tatsächlich: Warum?

Java:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Dimension;

public class TestView extends JFrame {
 
  public TestView() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    init();
    setVisible(true);
  }
 
  public void init() {
    setPreferredSize(new Dimension(300,300));
    
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();
    
    panel1.setLayout(new BorderLayout());
    panel2.setLayout(new GridLayout(0,1));
    //panel3 bleibt beim Standard-FlowLayout
    panel4.setLayout(new GridLayout(0,3,10,10));
    
    for (int i=0;i<10;i++) {
      panel4.add(new JSpinner());
      panel4.add(new JLabel("bis"));
      panel4.add(new JSpinner());
    } // end of for
    
    panel3.add(new JButton("Button a"));
    panel3.add(new JButton("Button b"));
    
    panel2.add(panel3);
    panel2.add(panel4);
    
    panel1.add(new JButton("Viel Content"), BorderLayout.CENTER);
    panel1.add(panel2, BorderLayout.LINE_END);
    
    getContentPane().add(panel1);
 
    pack();
    
    
  } 
}
 

Anhänge

  • GridLayout.PNG
    GridLayout.PNG
    6,1 KB · Aufrufe: 32

mihe7

Top Contributor
Hier frage ich mich tatsächlich: Warum?
Dein panel2 verwendet ein GridLayout, bei dem alle Komponenten in einem Gitter mit Zellen gleicher Größe angeordnet werden. Damit werden panel3 und panel4 gleich groß. Der Leerraum entsteht dann durch die Verwendung von FlowLayout in panel3, da dieses Layout den Platz nicht füllt, sondern eben leer lässt.
 

handoffate

Mitglied
Damit werden panel3 und panel4 gleich groß.
Oh, je. Genau das hatte ich natürlich nicht berücksichtigt. Vielen Dank.
Dann ist die Korrektur ja ganz simpel: Statt für panel2 ein GridLayout zu verwenden kommt ein BoxLayout zum Einsatz:
Code:
panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
Passt nun auch soweit. Eine Sache verwundert mich dann allerdings noch. Sobald ich das Fenster vergrößere und es größer wird, als benötigt, wächst der Platz zwischen den Buttons und den Spinnern (ähnlich wie beim GridLayout). Die Dokumentation besagt aber:
When a BoxLayout lays out components from top to bottom, it tries to size each component at the component's preferred height. If the vertical space of the layout does not match the sum of the preferred heights, then BoxLayout tries to resize the components to fill the space. The components either grow or shrink to fill the space, with BoxLayout honoring the minimum and maximum sizes of each of the components. Any extra space appears at the bottom of the container.
Also müsste ich doch davon ausgehen, dass der freie Platz unten erscheint?? Auch das Einfügen eines VerticalGlue wirkt nur bedingt..
 

mihe7

Top Contributor
BoxLayout tries to resize the components to fill the space. The components either grow or shrink to fill the space, with BoxLayout honoring the minimum and maximum sizes of each of the components. Any extra space appears at the bottom of the container.
Du hast die Antwort hier schon zitiert :) Das BoxLayout vergrößert die Komponenten bis zu ihrer maximum size. Wenn danach immer noch Platz übrig ist, wird der unten angefügt.

Sprich:
Java:
panel3.setMaximumSize(panel3.getPreferredSize());
panel4.setMaximumSize(panel4.getPreferredSize());
sollte helfen.
 

handoffate

Mitglied
Das BoxLayout vergrößert die Komponenten bis zu ihrer maximum size.
Ah ok, das leuchtet ein. Deine Lösung funktioniert auch soweit. Nur eine Sache scheint mir immer noch nicht ganz klar: Beim Vergrößern des Frames werden die Spinner auch vergrößert. War mir klar, weil ich zunächst die Size von Panel 4 unangetastet ließ. Dann habe ich die maximumSize der einzelnen Spinner gesetzt (vor allem die Höhe) und trotzdem wird die Größe auch oberhalb dieser maxSize gesetzt? Achtet BoxLayout nun doch nicht die maxSize aller Komponenten oder nur des Panels??
 

mihe7

Top Contributor
Es geht prinzipiell immer um die direkten Kindkomponenten. Um die Kindeskinder müssen sich die Kinder kümmern :) Allerdings kann ich das Problem grad nicht nachvollziehen, hast Du mal ein lauffähiges Beispiel? Wird aber ein wenig dauern, bis ich darauf antworte.
 

handoffate

Mitglied
hast Du mal ein lauffähiges Beispiel?
Klar, hat sich an sich nicht viel geändert ;)
Java:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Dimension;
import java.awt.event.*;

public class TestView extends JFrame {
    
  public TestView() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    init();
    setVisible(true);
  }
 
  public void init() {
    setPreferredSize(new Dimension(600,600));
    
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();
    
    
    
    panel1.setLayout(new BorderLayout());
    panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
    //panel3 bleibt beim Standard-FlowLayout
    panel4.setLayout(new GridLayout(0,3,10,10));
    
    
    for (int i=0;i<10;i++) {
      JSpinner a = new JSpinner();
      a.setMaximumSize(new Dimension((int)a.getMaximumSize().getWidth(),(int)a.getPreferredSize().getHeight()));
      panel4.add(a);
      panel4.add(new JLabel("bis"));
      JSpinner b = new JSpinner();
      b.setMaximumSize(new Dimension((int)b.getMaximumSize().getWidth(),(int)b.getPreferredSize().getHeight()));
      panel4.add(b);
    } // end of for
    
    panel3.add(new JButton("Button a"));
    panel3.add(new JButton("Button b"));
    
    panel3.setMaximumSize(panel3.getPreferredSize());
    //panel4.setMaximumSize(panel4.getPreferredSize());
    
    panel2.add(panel3);
    panel2.add(panel4);
    
    panel2.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
    
    panel1.add(new JButton("Viel Content"), BorderLayout.CENTER);
    panel1.add(panel2, BorderLayout.LINE_END);
    
    getContentPane().add(panel1);
 
    pack();

    
  } 
}
 

mihe7

Top Contributor
Ja, ist klar: wenn panel4 vergrößert wird, dann schlägt für die Komponenten im panel4 das GridLayout zu. Für panel2 (BoxLayout) ist nur die maximum size von panel4 relevant, nicht die Größen der Komponenten im panel4.
 

mihe7

Top Contributor
o_O Ich fühl mich grad echt blöd.. Danke für die Aufklärung.
Demnach schert sich das GridLayout nicht um die eingestellten Größen der Spinner-Komponenten. Kann man dieses Layout irgendwie dazu überreden, oder müsste dann ein gänzlich anderer Ansatz gewählt werden?
Ja, nur wenige der mitgelieferten LayoutManager berücksichtigen die max size. Die Frage ist: wie soll das Layout denn am Ende aussehen? Evtl. reicht es schon, panel4 nochmal in den Norden eines Panels mit BorderLayout zu packen.
 

mihe7

Top Contributor
Weil das BorderLayout im Norden/Süden nur in der Breite, nicht aber in der Höhe resized. Analog im Westen/Osten nur in der Höhe aber nicht in der Breite. Und im Zentrum in beide Richtungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Probleme bei der Positionierung von JPopupMenu AWT, Swing, JavaFX & SWT 2
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
L Probleme mit Programm AWT, Swing, JavaFX & SWT 13
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
L Probleme mit JPanel AWT, Swing, JavaFX & SWT 8
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
G kleinere Probleme mit GUI AWT, Swing, JavaFX & SWT 2
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J GUI-Aktualisierungs-Probleme AWT, Swing, JavaFX & SWT 4
B Performance-Probleme AWT, Swing, JavaFX & SWT 17
I Probleme if-Anweisung AWT, Swing, JavaFX & SWT 26
D Swing Probleme bei transparenten Hintergrund im JTextField AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben