Swing/PreventChangingTabsByInput のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/PreventChangingTabsByInput へ行く。
- 1 (2018-05-14 (月) 16:53:52)
- 2 (2018-05-15 (火) 14:03:23)
- 3 (2020-04-28 (火) 16:59:49)
- 4 (2021-10-30 (土) 21:38:44)
- 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(
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)