2017-05-04 13 views
2

私ははっきりBoxLayoutを使用して、コンポーネントを行全体に伸ばす方法を教えてください。

要素のどれもが最大幅を持っていない場合はどうすればと言うHow To Use BoxLayoutドキュメント、見ていますか?この場合、 のすべてのコンポーネントが同一のX位置合わせを持つ場合、すべてのコンポーネントは で、そのコンテナの幅になります。

JButtonインスタンスをJPanelに追加するとします。これらのボタンの最大幅がでない場合、であり、これらすべてのボタンでsetAlignmentX(Component.LEFT_ALIGNMENT)が呼び出されます。これらのボタンのそれぞれは、行全体に伸びる必要があります。ドキュメンテーションはこれを以下の画像を使って説明しています。

enter image description here

私はこの仕事を得ることができません!

setMaximumSize(null)とsetMaximumSize(new Dimension(-1,-1))setMaximumSize(new Dimension(0,0))をボタンで実行しようとしましたが、何も私には説明されている動作が与えられません。

は、ドキュメントには、それが言うときexcactlyどういう意味:

要素のどれもが最大幅を持っていない場合はどう?

最大幅は何ですか?


私が作ることができる最高のものは以下のとおりです。ドキュメントを読む私はボタンが行全体に伸びるはずだと思います。私は他のレイアウトマネージャを使うこともできますが、BoxLayoutでこれを実現したいと思います(ドキュメントが正しいと私には分かりました)。

enter image description here

public class CustomList extends JPanel { 

    private final Box box = Box.createVerticalBox(); 

    public CustomList() { 
     for (int i = 0; i < 10; i++) { 
      JButton b = new JButton("Button item" + i); 
      //b.setMaximumSize(new Dimension(0,0)); 
      b.setAlignmentX(Component.LEFT_ALIGNMENT); 
      box.add(b); 
     } 
     setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     add(box, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     CustomList l = new CustomList(); 
     l.setSize(200, 200); 
     l.setBackground(Color.red); 

     JFrame frame = new JFrame("Vertical Box"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(l, BorderLayout.CENTER); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
    } 

} 
+0

JButtonをJPanelに置き換えた場合、最大サイズの設定にかかわらず、各JPanelは行全体を伸ばします。 – sbrattla

答えて

2

あなたのボタンは、実際に最大幅を持っています。

ループでBorderLayoutのオブジェクトを作成し、各ボタンを各パネルに追加します(いずれにしてもデフォルトであるBorderLayout.CENTER)。

BorderLayout.CENTERは、その子Componentの最大サイズを気にしないので、あなたは、その全体の内容JButtonによって満たされるJPanelで終わります。

JPanel自体がComponentのデフォルトの最大サイズであるnew Dimension(Short.MAX_VALUE, Short.MAX_VALUE)(これは幅= 32767で、高さ= 32767 !!)の巨大なデフォルトの最大サイズを持っているので、あなたが期待した結果を取得します:

public CustomList() { 
    for (int i = 0; i < 10; i++) { 

     JPanel panel = new JPanel(new BorderLayout()); 
     JButton b = new JButton("Button item" + i); 
     //b.setMaximumSize(new Dimension(0,0)); 
     b.setAlignmentX(Component.LEFT_ALIGNMENT); 
     panel.add(b); 
     box.add(panel); 
    } 
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
    add(box, BorderLayout.CENTER); 
} 
+1

ありがとう、これはJButtonをJPanelに置き換えたときに見たものとよく似ています。つまり、パネルは行全体に伸びています。ありがとう! – sbrattla

+0

サイドノートとして、ボタンに最大幅があることを記載します。それは良い。しかし、どのようにコンポーネントが最大幅を持つことができますか?どのような意味ですか? – sbrattla

+1

"none"は誤解を招く、 "計算されていない"ことを意味するはずですが、実際にはJPanelは実際にはデフォルトの最大サイズを持っていますが、巨大で最大サイズがないと見なすことができます。 'Component'のソースコードから、デフォルトの最大サイズは' new Dimension(Short.MAX_VALUE、Short.MAX_VALUE) 'です。これはwidth = 32767、height = 32767です。 – Berger

関連する問題