qq_35571754 2023-04-08 13:21 采纳率: 50%
浏览 18
已结题

swing中自定义组件事件响应问题

swing中,自定义类继承自JComponent类,重写了
paintComponent方法,然后setENabled(fasle),为什么自定义的这个组件,还能响应鼠标事件,而且没有了addActionlistener方法。
用JButton创建的按钮,setEnabled(fasle)后,整个按钮就不能用了,不能响应任何事件。把自定义组件父类改成JButton,依然setEnabled(fasle)后还能响应鼠标事件,且依然没有addActionlistener方法。

请问,这是中间少了什么东西没继承下来吗?

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2023-04-08 19:22
    关注

    以下内容部分参考ChatGPT模型:


    在Java Swing中,JComponent是所有Swing组件的基类,包括JButton。setEnabled(false)会禁用一个组件,但并不会影响该组件的鼠标事件响应。这是因为setEnabled(false)只是改变组件的状态,使其变为不可用状态,但并没有从系统中移除该组件。因此,即使组件不可用,它仍然可以接收鼠标事件。

    如果你想禁用一个组件并且不希望它响应鼠标事件,可以通过覆盖processMouseEvent方法来实现。在该方法中,判断组件是否可用,如果不可用,则直接返回,不处理鼠标事件。示例如下:

    public class MyComponent extends JComponent {
        //...
    
        @Override
        protected void processMouseEvent(MouseEvent e) {
            if (!isEnabled()) {
                return;
            }
            super.processMouseEvent(e);
        }
    }
    

    这段代码覆盖了JComponent的processMouseEvent方法,在该方法中判断组件是否可用,如果不可用则直接返回,不处理鼠标事件。否则,调用父类的processMouseEvent方法处理鼠标事件。

    另外,对于自定义组件的事件响应,可以通过添加MouseListener或者MouseMotionListener来实现。例如,在MyComponent中添加一个MouseListener:

    public class MyComponent extends JComponent implements MouseListener {
        //...
    
        public MyComponent() {
            addMouseListener(this);
        }
    
        @Override
        public void mouseClicked(MouseEvent e) {
            //处理鼠标点击事件
        }
    
        @Override
        public void mousePressed(MouseEvent e) {
            //处理鼠标按下事件
        }
    
        @Override
        public void mouseReleased(MouseEvent e) {
            //处理鼠标释放事件
        }
    
        @Override
        public void mouseEntered(MouseEvent e) {
            //处理鼠标进入事件
        }
    
        @Override
        public void mouseExited(MouseEvent e) {
            //处理鼠标退出事件
        }
    }
    

    在MyComponent的构造方法中添加了一个MouseListener,然后实现了MouseListener中的方法来处理鼠标事件。这样,当鼠标在MyComponent上发生事件时,就会触发相应的处理方法。

    总之,setEnabled(false)只是将组件置为不可用状态,但并不会影响其鼠标事件响应。如果需要禁用组件并且不希望它响应鼠标事件,可以覆盖processMouseEvent方法。而对于自定义组件的事件响应,则需要添加MouseListener或者MouseMotionListener并实现相应的方法来处理事件。


    如果我的建议对您有帮助、请点击采纳、祝您生活愉快

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 maccms影视模板 制作影视网站失败 求
  • ¥15 stm32按键设置闹钟数进退位不正常
  • ¥15 三电平逆变器中点电位平衡问题
  • ¥20 这怎么写啊 java课设
  • ¥15 用C语言完成一个复杂的游戏
  • ¥15 如何批量更改很多个文件夹里的文件名中包含文件夹名?
  • ¥50 MTK手机模拟HID鼠标出现卡顿
  • ¥20 求下下面这个数据结构代码
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来