JTabbedPaneのスクロールレイアウトポリシーですべてのタブが非表示にならないよう設定する
Total: 2440
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTabbedPane
をスクロールタブレイアウトポリシーにしたとき、すべてのタブが非表示になる状態を回避するための方法をテストしています。
Screenshot
Advertisement
サンプルコード
JTabbedPane tabs = new JTabbedPane() {
@Override public void removeTabAt(int index) {
if (getTabCount() > 0) {
setSelectedIndex(0);
super.removeTabAt(index);
setSelectedIndex(index - 1);
} else {
super.removeTabAt(index);
}
}
};
tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
tabs.addTab("00000000", new JLabel("0"));
tabs.addTab("11111111", new JLabel("1"));
tabs.addTab("22222222", new JLabel("2"));
tabs.addTab("33333333", new JLabel("3"));
tabs.addTab("44444444", new JLabel("4"));
tabs.addTab("55555555", new JLabel("5"));
tabs.addTab("66666666", new JLabel("6"));
tabs.addTab("77777777", new JLabel("7"));
tabs.addTab("88888888", new JLabel("8"));
tabs.addTab("99999999", new JLabel("9"));
// TEST: tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
tabs.setSelectedIndex(tabs.getTabCount() - 1);
// TEST: tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
// // TEST:
// EventQueue.invokeLater(() -> {
// tabs.setSelectedIndex(tabs.getTabCount() - 1);
// // tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
// });
View in GitHub: Java, Kotlin解説
- 上段
JTabbedPane.SCROLL_TAB_LAYOUT
を設定したJTabbedPane
JTabbedPane
を表示状態である親コンポーネントに配置していない状態で末尾のタブを選択状態に設定しているため、このサンプルでは9
のタブのみが表示されているEventQueue.invokeLater(...)
などを使用してすでに表示された親コンポーネントに配置された後でJTabbedPane#setSelectedIndex(...)
を使用すれば回避可能- その場合は
5
から9
のタブが表示状態になる
- タブを追加した後で
JTabbedPane#setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT)
に変更すると0
から4
のタブが表示状態になる- ただしその後に
tabs.setSelectedIndex(tabs.getTabCount() - 1)
で末尾のタブを選択すると9
のタブのみが表示状態になる
- ただしその後に
9
のタブのみが表示されている状態でその末尾の9
のタブを削除すると、すべてのタブが非表示状態になる
- 中段
JTabbedPane#removeTabAt(...)
をオーバーライドし、タブの削除前に一旦先頭タブを選択、タブ削除、末尾タブを選択するとこで上記のようなすべてのタブが非表示状態になることを回避- 非表示状態のタブを
TabbedPane.setSelectedIndex(...)
で選択しても表示状態にならない?
- 非表示状態のタブを
WindowsLookAndFeel
で末尾タブが選択されると上記のスクリーンショットのようにタブ右端がスクロールボタンに掛かって途切れたような表示になる場合があるMetalLookAndFeel
などでは発生しない
- 下段
JTabbedPane#removeTabAt(...)
をオーバーライドし、タブの削除前に一旦先頭タブまでスクロール、タブ削除、末尾タブまでスクロールするとこで上記のようなすべてのタブが非表示状態になることを回避- スクロールしているだけなので、タブの選択状態は変化しない
- スクロールは、コンポーネント名が
TabbedPane.scrollableViewport(...)
のJViewport
を取得してJComponent#scrollRectToVisible(...)
メソッドを使用
参考リンク
- JTabbedPaneのTabAreaをスクロール
- JComponentの表示状態
- java - Scroll remaining tabs to visible after tab removal from a SCROLL_TAB_LAYOUT JTabbedPane - Stack Overflow