Swing/NewTabButton のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/NewTabButton へ行く。
- 1 (2009-06-08 (月) 13:05:45)
- 2 (2009-06-22 (月) 12:23:33)
- 3 (2009-07-13 (月) 22:53:24)
- 4 (2009-07-15 (水) 20:57:00)
- 5 (2009-08-12 (水) 16:22:28)
- 6 (2011-12-05 (月) 14:27:30)
- 7 (2012-03-21 (水) 01:07:43)
- 8 (2012-03-21 (水) 18:46:30)
- 9 (2012-04-03 (火) 18:51:31)
- 10 (2013-01-09 (水) 20:50:24)
- 11 (2014-05-09 (金) 12:16:39)
- 12 (2014-09-14 (日) 17:19:22)
- 13 (2014-10-15 (水) 01:56:08)
- 14 (2014-11-30 (日) 00:47:00)
- 15 (2016-02-18 (木) 15:54:42)
- 16 (2017-07-07 (金) 16:54:58)
- 17 (2018-02-24 (土) 19:51:30)
- 18 (2018-07-10 (火) 13:59:54)
- 19 (2018-10-30 (火) 16:36:07)
- 20 (2020-10-30 (金) 02:02:08)
- 21 (2022-09-09 (金) 16:02:46)
TITLE:JTabbedPane風のタブ配置をレイアウトマネージャーで変更
Posted by terai at 2009-01-05
JTabbedPane風のタブ配置をレイアウトマネージャーで変更
CardLayoutとJRadioBUttonで作成したJTabbedPane風コンポーネントのタブ配置を自作レイアウトマネージャーで変更します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
class TabLayout implements LayoutManager, java.io.Serializable {
public void addLayoutComponent(String name, Component comp) {}
public void removeLayoutComponent(Component comp) {}
public Dimension preferredLayoutSize(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int last = parent.getComponentCount()-1;
int w = 0, h = 0;
if(last>=0) {
Component comp = parent.getComponent(last);
Dimension d = comp.getPreferredSize();
w = d.width;
h = d.height;
}
return new Dimension(insets.left + insets.right + w,
insets.top + insets.bottom + h);
}
}
public Dimension minimumLayoutSize(Container parent) {
synchronized (parent.getTreeLock()) {
return new Dimension(100, 24);
}
}
public void layoutContainer(Container parent) {
synchronized (parent.getTreeLock()) {
Insets insets = parent.getInsets();
int ncomponents = parent.getComponentCount();
int nrows = 1;
int ncols = ncomponents-1;
//boolean ltr = parent.getComponentOrientation().isLeftToRight();
if (ncomponents == 0) {
return;
}
int lastw = parent.getComponent(ncomponents-1).getPreferredSize().width;
int width = parent.getWidth() - (insets.left + insets.right) - lastw;
int h = parent.getHeight() - (insets.top + insets.bottom);
int w = (width>100*(ncomponents-1))?100:width/ncols;
int gap = width - w*ncols;
int x = insets.left;
int y = insets.top;
for (int i=0;i<ncomponents;i++) {
int a = (gap>0)?1:0;
gap--;
int cw = (i==ncols)?lastw:w+a;
parent.getComponent(i).setBounds(x, y, cw, h);
x += w + a;
}
}
}
public String toString() {
return getClass().getName();
}
}
解説
上記のサンプルでは、以下のようなレイアウトマネージャーを作成してJRadioButtonをタブ風に並べています。
- 最後のタブ(タブ追加ボタン)は常に幅固定
- 最後のタブの高さがタブエリアの高さ
- タブエリアに余裕がある場合は、各タブ幅は100pxで一定
- タブエリアに余裕がない場合は、各タブ幅は均等
- その他
- タブを削除した場合、先頭タブにフォーカスが移動するようになっています。
- 左のJButton(ダミー)は、タブエリアをラップするJPanel(BorderLayout)の東に配置しています。