BoxLayout(Y_Axis) ignoriert preferedSize von Buttons

Rudi100

Neues Mitglied
Hallo,
laut Beschreibung der BoxLayout werden Komponenten nach ihrer preferredSize dargestellt. Das funktioniert bei mir nur, wenn der Button-Text gleich lang ist. Andernfalls erhalte ich verschieden breite Buttons.



Mein Quellcode lautet:
Java:
public class TestBoxLayout extends JFrame {
  private JPanel jContentPane = null;
  private JButton btnKurz = null;
  private JButton btnLang = null;

  public static void main(String[] args){
    new TestBoxLayout();
  }
   
  /**
   * This is the default constructor
   */
  public TestBoxLayout() {
    super();
    initialize();
  }

  /**
   * This method initializes this
   * 
   * @return void
   */
  private void initialize() {
    this.setSize(300, 200);
    this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
    this.setVisible(true);
  }

  /**
   * This method initializes jContentPane
   * 
   * @return javax.swing.JPanel
   */
  private JPanel getJContentPane() {
    if (jContentPane == null) {
      jContentPane = new JPanel();
      jContentPane.setLayout(new BoxLayout(getJContentPane(), BoxLayout.Y_AXIS));
      jContentPane.add(getBtnKurz(), null);
      jContentPane.add(getBtnLang(), null);
    }
    return jContentPane;
  }

  /**
   * This method initializes btnButton1	
   * 	
   * @return javax.swing.JButton	
   */
  private JButton getBtnKurz() {
    if (btnKurz == null) {
      btnKurz = new JButton();
      btnKurz.setText("kurz");
      btnKurz.setPreferredSize(new java.awt.Dimension(150,26));
    }
    return btnKurz;
  }

  /**
   * This method initializes btnLang	
   * 	
   * @return javax.swing.JButton	
   */
  private JButton getBtnLang() {
    if (btnLang == null) {
      btnLang = new JButton();
      btnLang.setText("LangLangLang");
      btnLang.setPreferredSize(new java.awt.Dimension(150,26));
    }
    return btnLang;
  }
}

Wie kann ich die Buttons mit gleicher Breite darstellen (bei unterschiedlicher Textbreite)?
Für einen Tipp danke ich ganz herzlich.

Rudi100
 
Hallo,

habe rumprobiert und es funktioniert, wenn du bei den JButtons setMaximumSize(Dimension) einstellst. Warum, kann ich dir leider nicht sagen, auch nicht, wie du das hättest wissen können.

Gruß n.

edit: nun habe ich erfahren, dass es zum BoxLayout eine Art bedienungsanleitung namens "How To Use BoxLayout" gibt ^^
 
Zuletzt bearbeitet von einem Moderator:
Hallo --

Ja nach verwendetem Layout-Manager werden Size-Zuweisungen beachtet oder eben ignoriert. Also kann es durchaus sein, dass die "preferredSize" einmal berücksichtigt wird, ein anderes Mal nicht. Wenn ich mich nicht täusche, werden hingegen "minimum" und "maximum" Size öfter berücksichtigt -- was auch plausibel ist.
Grundsätzlich wird dieses für den grafikunerfahrenen Programmierer eher unberechenbar erscheinende Verhalten sicher seinen "tieferen" Sinn haben, schließlich soll durch den Einsatz der Manager ja eine Flexibilität im Falle eines Fenster-Resizings gewährleistet werden. Bzw. soll durch geschickte Wahl und Schachtelung von Layout-Managern in vielen Fällen quasi "von selbst" ein praxistaugliches Layout der Fensterelemente zustandekommen, ohne dass der Programmierer sich bei jedem einzelnen davon auf eine Größe festlegen muss.

Mir gelingt dies allerdings auch bislang nur selten zufriedenstellend. Insbesondere die Option, für genau EINE -- und NUR EINE -- Dimension (Höhe/Breite) eine Größe festlegen zu können, vermisse ich doch schmerzlich ...
 
So wie ich die Frage verstanden habe, geht's hier zunächst mal "nur" darum, warum die Buttons unterschiedlich breit sind, obwohl per "preferredSize" dieselbe Breite zugewiesen worden ist.
Inwieweit dabei auch eine Rolle spielt, dass die Buttons eine gesetzte "maximum"/"minimum width" haben, obwohl das nicht explizit im Code steht, überblicke ich gerade nicht ganz. (Haben sie denn allein schon durch den Beschriftungstext gesetzte Breiten?)

Das verlinkte Tutorial ist aber sicher sehr hilfreich, wenn einem die Arbeitsweise von BoxLayout nicht sofort einleuchtet (und wem tut sie das schon ...).
 

Zurück
Oben