MouseListener/KeyListener不起作用(JPanel)

5

我正在进行一个涉及JPanel中鼠标和键盘监听器的小项目。不幸的是,在使用鼠标/键盘时,没有任何方法被调用。我之前曾经使用过JPanels/JFrame/JApplet和JComponents。以下是代码片段:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.Scanner;

public class Hello extends JPanel implements KeyListener, MouseListener{
    JPanel panel = new JPanel();
    JFrame frame = new JFrame();
    public Hello(){
        addKeyListener(this);
        addMouseListener(this);
    }
    public static void main(String [] args){
        Hello play = new Hello();
        play.setPanel();
    }
    public void setPanel(){
        panel.setLayout(null);
        frame.add(panel);
        frame.setLayout(null);
        panel.setBounds(0,0,100,100);
        frame.setVisible(true);
        panel.setVisible(true);
        panel.setFocusable(true);
        frame.setSize(100,100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void keyTyped(KeyEvent evt){
        System.out.println("keytyped");
    }
    public void keyPressed(KeyEvent evt){
        System.out.print("keypressed");
    }
    public void keyReleased(KeyEvent evt){
        System.out.println("keyreleased");
    }
    public void mousePressed(MouseEvent evt){
        System.out.println("mousepressed");
    }
    public void mouseReleased(MouseEvent evt){
        System.out.println("mousereleased");
    }
    public void mouseClicked(MouseEvent evt){
        System.out.println("mouseclicked");
    }
    public void mouseEntered(MouseEvent evt){
        System.out.println("mousenentered");
    }
    public void mouseExited(MouseEvent evt){
        System.out.println("mouseexited");
    }
}

题外话:我一直收到错误提示,提示消息如下:“您的帖子似乎包含格式不正确的代码。请使用代码工具栏按钮或CTRL+K键盘快捷方式将所有代码缩进4个空格。如需更多编辑帮助,请单击工具栏图标[?]。”我不知道该怎么修复它。有时候我把所有内容都放在代码块里,但仍无法提交。

3个回答

12

请查看Java KeyListener for JFrame is being unresponsive?

你需要为每个想要监听的JComponent注册你的KeyListenerMouseListener

public Hello() {
    addKeyListener(this);
    addMouseListener(this);
    panel.addKeyListener(this);
    panel.addMouseListener(this);
    frame.addKeyListener(this);
    frame.addMouseListener(this);
}

编辑:
键盘和鼠标事件仅从具有焦点的JComponent触发。因此,似乎普遍认为使用KeyBindings比使用KeyListeners更好。不过,两者都有各自的应用场景,所以这里没有硬性规定。阅读'如何编写键盘侦听器'和'如何编写键绑定',你就能领会其要点。


谢谢。这也适用于JComponents吗?比如每个JLabel、JTextField等等?或者只要将它们添加到面板上,它们就都能工作?将在5分钟内投票。 - GoldenLyfe
2
是的,唯一会触发事件的 JComponent 是当前具有 focus 的组件。如何编写键盘监听器如何编写键绑定 详细介绍了两者之间的差异;这些差异非常微妙,但在编写稍后可能会丢弃的代码之前掌握它们是值得的。 - Sean Connolly
@SeanConnolly 请将该评论作为您的答案的一部分。应该避免使用KeyListeners(部分原因是如此),而应该使用KeyBindings。 - MadProgrammer

2
最好避免在 JPanel 中使用 KeyListeners,而是使用KeyBindings。因为 JPanel 无法获得焦点,所以无法与 KeyEvents 交互。使用 KeyBindings,即使组件没有焦点,也可以将一个操作映射到一个键盘按键。请保留 HTML 标签。

1

可以试试这个:

 panel.addKeyListener(this);
 panel.addMouseListener(this);

你必须将监听器添加到每个想要监听的组件。


1
感谢您的贡献。提供一个解决方案是好的,但解释为什么它能起作用则更好(http://stackoverflow.com/questions/how-to-answer)。 - ARRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接