【问题标题】:Java Event listeners (mouse and keyboard)Java 事件监听器(鼠标和键盘)
【发布时间】:2026-01-31 05:40:01
【问题描述】:

所以我的程序中的所有东西都可以正常工作,除了鼠标和键盘监听器。 我有几个 actionListener 在 Jbuttons 上工作,它们完全符合我在这里想要做的事情,但任务说它必须与所有三个一起工作。 所以我想知道为什么它可以编译,但不起作用。我是不是做错了什么?

panel.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {

        }

        @Override
        public void keyPressed(KeyEvent e) {
             if(e.getKeyCode() == KeyEvent.VK_UP){
                shape.addSides();
            }
            if(e.getKeyCode() == KeyEvent.VK_DOWN){
                shape.subSides();
            }
        }

        @Override
        public void keyReleased(KeyEvent e) {

        }

    }

    );
    panel.addMouseListener(new MouseListener(){
        @Override
        public void mouseEntered(MouseEvent e){
            if(e.getButton() == MouseEvent.BUTTON1){

                shape.addSides();
            }
            if(e.getButton() == MouseEvent.BUTTON3){

                shape.subSides();
            }

        }

        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {   
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

    }
    );

【问题讨论】:

    标签: java swing event-handling mouseevent keyboard-events


    【解决方案1】:

    关于 KeyListener:除非被监听的组件是可聚焦的并且有焦点,否则它不会工作。因此,您需要在 JPanel 上调用 setFocusable(true)requestFocusInWindow()。至于 MouseListener - 其他东西可能会占用鼠标事件并阻止它到达您的 JPanel。要调试此问题,您需要发布 minimal, compilable, runnable example program

    另外关于你的 MouseListener,你在一个没有意义的 mouseEntered 事件中检查getButton()。此类事件不涉及按钮。您是要检查 MouseMotionListener 的 mouseDragged(...) 吗?

    【讨论】:

    • +1。另一种方法是使用JComponent.WHEN_IN_FOCUSED_WINDOW 条件在JButton 上设置键绑定,如Q&A 中所述
    • 完全错过了我书中的setFocusable(true)requestFocusInWindow()。那为我修好了键盘。至于 mouseListener 的放置,我把它放在原来的上面。当它不起作用时,我对所有 4 个都做了一个 copypasta,希望其中一个能起作用,但它没有。当我把它放在mouseClicked() 中时,它确实有效。感谢您的帮助。我按时完成了项目。