Swing/TabbedPaneWithButton のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TabbedPaneWithButton へ行く。
- 1 (2008-03-03 (月) 14:07:59)
- 2 (2008-03-04 (火) 17:16:52)
- 3 (2008-03-12 (水) 19:34:00)
- 4 (2008-06-20 (金) 12:21:06)
- 5 (2009-06-22 (月) 12:27:54)
- 6 (2013-01-24 (木) 01:02:10)
- 7 (2013-08-22 (木) 15:32:49)
- 8 (2013-09-10 (火) 00:42:31)
- 9 (2013-10-08 (火) 15:00:05)
- 10 (2014-10-24 (金) 16:30:05)
- 11 (2014-11-01 (土) 00:46:09)
- 12 (2014-11-25 (火) 03:03:31)
- 13 (2015-03-10 (火) 15:59:47)
- 14 (2015-03-20 (金) 15:25:35)
- 15 (2016-05-27 (金) 13:19:31)
- 16 (2016-06-02 (木) 12:28:04)
- 17 (2017-09-08 (金) 19:13:31)
- 18 (2017-11-02 (木) 15:34:40)
- 19 (2019-02-18 (月) 13:51:57)
- 20 (2020-12-06 (日) 00:10:29)
- 21 (2022-01-10 (月) 02:53:39)
- 22 (2022-08-20 (土) 22:15:25)
- 23 (2024-05-09 (木) 18:07:16)
TITLE:JTabbedPaneの余白にJButtonを配置
Posted by terai at 2008-03-03
JTabbedPaneの余白にJButtonを配置
JTabbedPaneのタブエリアに余白を作成し、そこにOverlayLayoutを使ってJButtonを配置します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
JPanel p = new JPanel();
p.setLayout(new OverlayLayout(p));
button.setAlignmentX(0.0f);
button.setAlignmentY(0.0f);
tabPane.setAlignmentX(0.0f);
tabPane.setAlignmentY(0.0f);
p.add(button);
p.add(tabPane);
public InsetsUIResource getButtonPaddingTabAreaInsets(JButton b) {
int bw = b.getPreferredSize().width;
int bh = b.getPreferredSize().height;
Insets insets = UIManager.getInsets("TabbedPane.tabInsets");
Insets ti = (insets!=null)?insets:new Insets(0,0,0,0);
insets = UIManager.getInsets("TabbedPane.tabAreaInsets");
Insets ai = (insets!=null)?insets:new Insets(0,0,0,0);
FontMetrics metrics = getFontMetrics(getFont());
int tih = bh - metrics.getHeight()-ti.top-ti.bottom-ai.bottom;
return new InsetsUIResource(Math.max(ai.top, tih), bw+ai.left, ai.bottom, ai.right);
}
解説
上記のサンプルは、以下のような動作*1の仕様になっています。
- タブエリアの左上にあるボタンをクリックするとタブが追加される
- メニューからすべてのタブを削除する
- タブエリアに余裕がある場合は80pt、無い場合は(タブエリアの幅/タブ数)と、常にタブ幅は一定
- 折り返しや、スクロールが発生するとレイアウトが崩れるため
コンポーネントの追加には、以下の方法を使用しています(比較:JTabbedPaneの余白にJCheckBoxを配置)。
- ボタンの幅だけ、tabAreaInsets の左余白を拡大する
- UIManager.getInsets("TabbedPane.tabAreaInsets")などを使用するため、Synthなど(GTK, Nimbus)のL&Fには対応していない
- Nimbus L&F: java.lang.NullPointer Exception throws when extended BaseUI Components
- OverlayLayout で、JButtonとJTabbedPane(上で作った余白に)を重ねて表示
- このため、JTabbedPane.TOP にしか対応していない
参考リンク
- famfamfam.com: Mini Icons
- 追加アイコンを拝借しています。
- OverlayLayoutの使用
- JTabbedPaneの余白にJCheckBoxを配置
- JTabbedPaneのタイトルをクリップ
- Swing - Any layout suggestions for this?