Java 重新定位Jtable列标题

Java 重新定位Jtable列标题,java,swing,jtableheader,mouse-listeners,right-mouse-button,Java,Swing,Jtableheader,Mouse Listeners,Right Mouse Button,我必须禁用右键单击JTableHeader,这样用户就不能右键单击列标题并拖动来重新定位列。我们有什么办法吗?只需提到鼠标左键点击效果很好,但当用户执行RMB并拖动列时,该列将被移动,并在释放鼠标时在其他列上重新绘制 非常感谢您的帮助。我尝试了Java版本1.7.0_11和1.6.0_38,并执行了以下操作: table.getTableHeader().setReorderingAllowed(false); 将柱锁定到位。您可能正在使用较旧的Java版本,还是以其他方式禁用?用右键触发列拖

我必须禁用右键单击JTableHeader,这样用户就不能右键单击列标题并拖动来重新定位列。我们有什么办法吗?只需提到鼠标左键点击效果很好,但当用户执行RMB并拖动列时,该列将被移动,并在释放鼠标时在其他列上重新绘制


非常感谢您的帮助。

我尝试了Java版本1.7.0_11和1.6.0_38,并执行了以下操作:

table.getTableHeader().setReorderingAllowed(false);

将柱锁定到位。您可能正在使用较旧的Java版本,还是以其他方式禁用?

用右键触发列拖动/调整大小显然是一个错误

一个奇怪的解决方法是挂接uidelegate安装的鼠标/运动/侦听器,并静默地吃掉所有不是左键的事件。类似于(注意:这个包装侦听器的一个更健壮的安装可以在LAF切换后继续使用):

公共静态类BugHook实现了MouseListener、MouseMotionListener{
私有JTableHeader;
私人穆塞利斯滕纳·穆塞德雷特;
私有MouseMotionListener-motionDelegate;
公共挂钩(JTableHeader){
this.header=头;
MouseListener[]ls=header.getMouseListeners();
对于(int i=0;i
hmm。。对我来说,听起来像是tableHeader/UI中的一个bug:右拖动根本不会触发列移动。我想,我已经看到了不完整的移动(右拖动),但无法可靠地复制。您可能会考虑在Oracle java bug阅览器中发布一个问题。这不是解决问题(据我理解的):列应该是可拖动的,但只由左鼠标按钮触发,右按钮不应该有效果。
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);
    }

}