ユーザーが列ヘッダーを右クリックして列を再配置できないように、JTableHeader の右クリックを無効にする必要があります。それを行うためのトリックはありますか?マウスの左ボタンのクリックはうまく機能しますが、ユーザーがRMBを実行して列をドラッグすると、列が移動し、マウスが離されると他の列の上に再描画されます。
どんな助けでも大歓迎です。
ユーザーが列ヘッダーを右クリックして列を再配置できないように、JTableHeader の右クリックを無効にする必要があります。それを行うためのトリックはありますか?マウスの左ボタンのクリックはうまく機能しますが、ユーザーがRMBを実行して列をドラッグすると、列が移動し、マウスが離されると他の列の上に再描画されます。
どんな助けでも大歓迎です。
右ボタンで列のドラッグ/サイズ変更をトリガーすることは、明らかにバグIMOです。
厄介な回避策は、uidelegateによってインストールされたマウス/モーション/リスナーに接続し、左ボタン以外のすべてのイベントをサイレントに食べることです。次のようなものです(注:LAFスイッチに耐えるこのラッピングリスナーのより堅牢なインストールは、最近の回答で概説されています):
public static class BugHook implements MouseListener, MouseMotionListener {
private JTableHeader header;
private MouseListener mouseDelegate;
private MouseMotionListener motionDelegate;
public BugHook(JTableHeader header) {
this.header = header;
MouseListener[] ls = header.getMouseListeners();
for (int i = 0; i < ls.length; i++) {
header.removeMouseListener(ls[i]);
String name = ls[i].getClass().getName();
if (name.contains("TableHeaderUI")) {
this.mouseDelegate = ls[i];
ls[i] = this;
}
}
for (MouseListener l : ls) {
header.addMouseListener(l);
}
MouseMotionListener[] motionLs = header.getMouseMotionListeners();
for (int i = 0; i < motionLs.length; i++) {
header.removeMouseMotionListener(motionLs[i]);
String name = motionLs[i].getClass().getName();
if (name.contains("TableHeaderUI")) {
this.motionDelegate = motionLs[i];
motionLs[i] = this;
}
}
for (MouseMotionListener l : motionLs) {
header.addMouseMotionListener(l);
}
}
// methods delegation left buttons only
@Override
public void mousePressed(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e)) return;
mouseDelegate.mousePressed(e);
}
@Override
public void mouseDragged(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e)) return;
motionDelegate.mouseDragged(e);
}
@Override
public void mouseReleased(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e)) return;
mouseDelegate.mouseReleased(e);
}
/// ---------- methods delegating always
@Override
public void mouseClicked(MouseEvent e) {
mouseDelegate.mouseClicked(e);
}
@Override
public void mouseEntered(MouseEvent e) {
mouseDelegate.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
mouseDelegate.mouseExited(e);
}
@Override
public void mouseMoved(MouseEvent e) {
motionDelegate.mouseMoved(e);
}
}
私は Java バージョン 1.7.0_11 と 1.6.0_38 を試してみました。
table.getTableHeader().setReorderingAllowed(false);
列を所定の位置にロックします。おそらく古い Java バージョンを使用していますか、それとも他の方法で無効にしていますか?