JTableHeaderの列をマウスの右ボタンドラッグで順序変更不可にする
Total: 1752
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JLayer
を使用してJTableHeader
の列をマウスの右ボタンでドラッグしても順序変更不可に設定します。
Screenshot
Advertisement
サンプルコード
class DisableRightButtonSwapLayerUI extends LayerUI<JScrollPane> {
@Override public void installUI(JComponent c) {
super.installUI(c);
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
}
@Override public void uninstallUI(JComponent c) {
if (c instanceof JLayer) {
((JLayer<?>) c).setLayerEventMask(0);
}
super.uninstallUI(c);
}
@Override protected void processMouseMotionEvent(
MouseEvent e, JLayer<? extends JScrollPane> l) {
int id = e.getID();
Component c = e.getComponent();
if (c instanceof JTableHeader &&
id == MouseEvent.MOUSE_DRAGGED &&
SwingUtilities.isRightMouseButton(e)) {
e.consume();
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTableHeader
の列をマウスの右ボタンでドラッグした場合のみ順序変更不可に設定しています。
Default
- 右ボタンでドラッグ可能なので、
JTableHeader
の外部まで列をドラッグしてポップアップメニューを開くと描画が乱れる場合があるJPopupMenu#show(...)
メソッドをオーバーライドしてドラッグ中の列をクリア、ヘッダの再描画などを実行して回避する必要がある
- 列の入れ替えを禁止する場合は
table.getTableHeader().setReorderingAllowed(false);
を設定する
- 右ボタンでドラッグ可能なので、
Disable right mouse button reordering
JLayer
をJTable
を配置したJScrollPane
に設定LayerUI#processMouseMotionEvent(...)
メソッドをオーバーライドし、JTableHeader
上の右ボタンでのドラッグイベントを消費
- マウスの左、中ボタンでのドラッグは有効
- マウスの右ボタンをクリックして
JTableHeader
に設定したポップアップメニューを開くことは可能 - 左ボタンでドラッグ開始、途中で左右両方のボタンを押して右ボタンを後からリリースすると
JTableHeader
の外部でポップアップメニューを開くことが可能なので、Default
と同様にJPopupMenu#show(...)
メソッドをオーバーライドしてドラッグ中の列をクリア、ヘッダの再描画などを実行する必要がある - [JDK-8068824] Exception thrown in JTableHeader after clicking on popupmenu opened with right-click on header - Java Bug System
参考リンク
- JTableのヘッダ入れ替えを禁止
- JTableHeaderに追加された各TableColumnの表示・非表示を切り替える
- JComboBoxのドロップダウンリストで右クリックを無効化
- こちらのサンプル同様、
WindowsLookAndFeel
でのみ右ボタンドラッグを無効にしても良いかもしれない
- こちらのサンプル同様、
- JToolBarの右マウスボタンでのドラッグアウトを無効にする
- [JDK-8068824] Exception thrown in JTableHeader after clicking on popupmenu opened with right-click on header - Java Bug System