有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重新定位Jtable列标题

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

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

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

    一个古怪的解决方法是挂接uidelegate安装的鼠标/运动/侦听器,并静默地吃掉所有不是左键的事件。类似于(注意:这个包装侦听器的一个更健壮的安装是outlined in a recent answer,它可以在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);
        }
    
    }