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 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)