JTabbedPaneでマウスやキー入力によるタブ切替を無効にする
Total: 2367
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTabbedPane
でマウスクリックやキー入力といったユーザ操作イベントによるタブ切替を無効にします。
Screenshot
Advertisement
サンプルコード
class DisableInputLayerUI extends LayerUI<Component> {
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(
AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK
| AWTEvent.MOUSE_WHEEL_EVENT_MASK | AWTEvent.KEY_EVENT_MASK
| AWTEvent.FOCUS_EVENT_MASK | AWTEvent.COMPONENT_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override public void eventDispatched(AWTEvent e, JLayer<? extends Component> l) {
if (e instanceof InputEvent && Objects.equals(l.getView(), e.getSource())) {
((InputEvent) e).consume();
}
}
}
View in GitHub: Java, Kotlin解説
- 上:
setEnabled(false)
JTabbedPane#setEnabled(false)
ですべてのタブの切替を禁止- 内部タブコンポーネントには影響しない
next
ボタンでJTabbedPane#setSelectedIndex(...)
メソッドを使用してタブを切り替えることは可能
JTabbedPane#setFocusable(false)
を設定している場合でもWindowsLookAndFeel
ではマウスカーソルのあるタブがハイライトされるUIManager.put("TabbedPane.disabledAreNavigable", Boolean.TRUE)
は効果がない- DisabledなJMenuItemのハイライトをテスト
- 中:
setTabComponentAt(...)
- 上のサンプルと同様に
JTabbedPane#setEnabled(false)
ですべてのタブの切替を禁止 JTabbedPane#setTabComponentAt(idx, new JLabel(title))
でタブタイトルコンポーネントをJLabel
に置き換え、使用不可になっているタブタイトルの文字色を使用可の状態に戻す
- 上のサンプルと同様に
- 下:
DisableInputLayerUI()
JTabbedPane
にマウスイベントやキー入力イベントをすべて消費するLayerUI
を設定してすべてのタブの切替を禁止LayerUI#eventDispatched(...)
メソッドをオーバーライドしてすべてのInputEvent
を消費すると内部タブコンポーネント(このサンプルではJTextField
)も入力不可になるので、JLayer
を設定したJTabbedPane
の場合のみイベントを消費する用設定@Override public void eventDispatched(AWTEvent e, JLayer<? extends Component> l) { if (e instanceof InputEvent && Objects.equals(l.getView(), e.getSource())) { ((InputEvent) e).consume(); } }
参考リンク
- JTabbedPane#setEnabledAt(boolean) (Java Platform SE 8)
- LayerUI#eventDispatched(...) (Java Platform SE 8)