Swing/ComponentList のバックアップの現在との差分(No.1)
TITLE:JComponentをリスト状に並べる
JComponentをリスト状に並べる
編集者:Terai Atsuhiro~
作成日:2004-03-22
更新日:2022-08-02 (火) 16:37:39
概要
高さの異なるコンポーネントをスクロールできるようにリスト状に並べます。Screenshot
Advertisement
概要
高さの異なるコンポーネントをリスト状に並べてみます。サンプルコード
#spanend
#spanadd
private final Box box = Box.createVerticalBox();
#spanend
#spanadd
private final Component glue = Box.createVerticalGlue();
#spanend
#spanadd
public void addComp(JComponent comp) {
#spanend
comp.setMaximumSize(new Dimension(
Short.MAX_VALUE, comp.getPreferredSize().height));
box.remove(glue);
box.add(Box.createVerticalStrut(5));
box.add(comp);
box.add(glue);
box.revalidate();
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
comp.scrollRectToVisible(comp.getBounds());
}
});
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin#screenshot
解説
上記のサンプルでは、Box.createVerticalBox()
で作成したBox
にコンポーネントを追加してリスト状に並べています。
サンプルコード
public void addComp(JComponent label) { SpringLayout layout = new SpringLayout(); Component[] list = pnl.getComponents(); if(list.length==0) { layout.putConstraint( SpringLayout.WEST,label,0,SpringLayout.WEST,pnl); layout.putConstraint( SpringLayout.NORTH,label,0,SpringLayout.NORTH,pnl); }else{ JComponent cmp = null; for(int i=0;i<list.length;i++) { JComponent tmp = (JComponent)list[i]; layout.putConstraint( SpringLayout.WEST,tmp,0,SpringLayout.WEST,pnl); if(cmp==null) { layout.putConstraint( SpringLayout.NORTH,tmp,0,SpringLayout.NORTH,pnl); }else{ layout.putConstraint( SpringLayout.NORTH,tmp,0,SpringLayout.SOUTH,cmp); } cmp = tmp; } layout.putConstraint( SpringLayout.WEST,label,0,SpringLayout.WEST,pnl); layout.putConstraint( SpringLayout.NORTH,label,0,SpringLayout.SOUTH,cmp); } pnl.add(label); pnl.setLayout(layout); initComps(); }
- 各コンポーネントの高さは変化せず幅だけフレームサイズに追従するように
JComponent#setMaximumSize(...)
を設定 - 各コンポーネントの高さの合計がフレームの高さより小さい場合は下部に余白が生成されるよう末尾に
Box.createVerticalGlue()
を追加
public void initComps() { Rectangle rv = scroll.getViewport().getViewRect(); Insets ins = pnl.getInsets(); int cw = (int)rv.getWidth() - ins.left - ins.right; int ch = 0; Component[] list = pnl.getComponents(); for(int i=0;i<list.length;i++) { JComponent tmp = (JComponent)list[i]; int th = tmp.getPreferredSize().height; tmp.setPreferredSize(new Dimension(cw, th)); ch = ch + th; } Dimension d = new Dimension( (int)rv.getWidth(),ch+ins.top+ins.bottom); pnl.setPreferredSize(d); pnl.revalidate(); }
参考リンク
- &jnlp;
- &jar;
- &zip;
コメント
-
SpringLayout
ではなく、BoxLayout
を使うようにサンプルを変更しました。 -- aterai - 解説がソースと異なり、
setMinimumSize
となっていたのをsetMaximumSize
に修正。 -- aterai
解説
上記のサンプルでは、SpringLayoutを使ってパネルにコンポーネントを並べています。右クリックのポップアップメニューから、高さの異なるラベルとボタンを追加することができます。追加されたコンポーネントの幅はJListのようにViewportに合わせて変化しますが、高さはsetPreferredSize()で設定されたものを維持します。 チュートリアルのSpringFormにあるSpringUtilities.javaを使用すると、サンプルのaddCompメソッドは以下のように書くこともできます。public void addComp2(JComponent cmp) { pnl.add(cmp); Component[] list = pnl.getComponents(); SpringUtilities.makeCompactGrid(pnl, list.length, 1, //rows, cols 6, 6, //initX, initY 6, 6); //xPad, yPad initComps(); }