Java 鼠标侦听器/按键侦听器不工作(JPanel)

Java 鼠标侦听器/按键侦听器不工作(JPanel),java,swing,jpanel,keylistener,mouselistener,Java,Swing,Jpanel,Keylistener,Mouselistener,我正在做一个小项目,涉及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; i

我正在做一个小项目,涉及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个空格。有关更多编辑帮助,请单击[?]工具栏图标。 我不知道如何修理它。有时我将所有内容都放在代码中,但它仍然无法提交。

请尝试以下方法:

 panel.addKeyListener(this);
 panel.addMouseListener(this);
您必须将侦听器添加到每个要侦听的组件中。

看一看

您需要为要收听的每个
JComponent
注册
KeyListener
MouseListener

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

按键和鼠标事件仅从当时具有焦点的
JComponent
触发。因此,似乎有一种共识,即键绑定可能对键侦听器有利。然而,这两者都有各自的应用,因此这里没有硬性规定。阅读一下“”和“”,你就会明白要点。

最好不要在
JPanel
中使用
KeyListeners
,而是使用
JPanel
无法获得焦点,因此无法与
KeyEvents
交互。使用
KeyBindings
,即使组件没有焦点,也可以将操作映射到击键。

谢谢。这是否也适用于JComponents?像每个JLabel、JTextField等。?或者,如果我将它们添加到面板中,它们都会工作吗?将在5分钟内投票。是的,唯一将触发事件的
JComponent
是当时具有
焦点的组件。打破二者的差异,;这是非常微妙的,但在编写代码之前值得掌握,稍后您将丢弃这些代码。@Sean请将这些注释作为您答案的一部分。应该避免使用KeyListeners(部分是出于这个原因)而使用KeyBinding感谢您的贡献。给出一个解决方案是好的,解释它为什么有效更好()。