Swing/PreventChangingTabsByInput のバックアップの現在との差分(No.1)
- category: swing folder: PreventChangingTabsByInput title: JTabbedPaneでマウスやキー入力によるタブ切替を無効にする tags: [JTabbedPane, JLayer] author: aterai pubdate: 2018-05-14T16:52:16+09:00 description: JTabbedPaneでマウスクリックやキー入力といったユーザ操作イベントによるタブ切替を無効にします。 image: https://drive.google.com/uc?id=16r3rq9ec_trXinEuHffylP6ycwwlGFUGaw
概要
JTabbedPane
でマウスクリックやキー入力といったユーザ操作イベントによるタブ切替を無効にします。
Screenshot
Advertisement
サンプルコード
class DisableInputLayerUI extends LayerUI<Component> {
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(
((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);
}
}
#spanadd
#spanend
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer) c).setLayerEventMask(0);
((JLayer<?>) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
#spanadd
#spanend
@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)
で、すべてのタブの切替を禁止 -
JTabbedPane#setEnabled(false)
ですべてのタブの切替を禁止- 内部タブコンポーネントには影響しない
next
ボタンでJTabbedPane#setSelectedIndex(...)
メソッドを使用してタブを切り替えることは可能
-
JTabbedPane#setFocusable(false)
を設定している場合でも、WindowsLookAndFeel
ではマウスカーソルのあるタブがハイライトされる -
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
の場合のみイベントを消費する用設定 - 上のサンプルと同様に
JTabbedPane#setEnabled(false)
ですべてのタブの切替を禁止 -
JTabbedPane#setTabComponentAt(idx, new JLabel(title))
でタブタイトルコンポーネントをJLabel
に置き換え、使用不可になっているタブタイトルの文字色を使用可の状態に戻す
-
- 下:
DisableInputLayerUI()
-
JTabbedPane
にマウスイベントやキー入力イベントをすべて消費するLayerUI
を設定してすべてのタブの切替を禁止 -
LayerUI#eventDispatched(...)
メソッドをオーバーライドしてすべてのInputEvent
を消費すると内部タブコンポーネント(このサンプルではJTextField
)も入力不可になるので、JLayer
を設定したJTabbedPane
の場合のみイベントを消費する用設定#spandel @Override public void eventDispatched(AWTEvent e, JLayer<? extends Component> l) { #spanend #spanadd @Override #spanend #spanadd public void eventDispatched(AWTEvent e, JLayer<? extends Component> l) { #spanend 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)