MouseListener / KeyListener无法正常工作(JPanel)

我正在做一个涉及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"); } } 

关闭主题:我一直收到错误您的post似乎包含未正确格式化为代码的代码。 请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。 有关更多编辑帮助,请单击[?]工具栏图标。 我不知道如何解决它。 有时我把所有东西都放在代码中,它仍然不会提交。

看看Java KeyListener对JFrame没有反应? 。

您需要为要侦听的每个JComponent注册KeyListenerMouseListener

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

编辑:
键和鼠标事件仅从当时具有焦点的JComponent触发。 因此,似乎一致认为KeyBindings可能对KeyListeners有利。 然而,这两者都有它们的应用,所以这里没有硬性规定。 阅读“ 如何编写密钥监听器 ”和“ 如何编写密钥绑定 ”,您将获得要点。

最好避免将KeyListenersJPanel使用,而是使用KeyBindings 。 JPanel无法获得焦点,因此无法与KeyEvents交互。 使用KeyBindings ,即使组件没有焦点,也可以将Action映射到KeyStroke。

试试这个:

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

您必须将侦听器添加到要侦听的每个组件。