gpt4 book ai didi

java - JPanel 中的 KeyListener 不起作用(面板已聚焦)

转载 作者:行者123 更新时间:2023-12-01 18:42:29 25 4
gpt4 key购买 nike

正如标题所说,我正在尝试向 JPanel 添加一个按键监听器。到目前为止,我让它工作的唯一方法是添加一个空文本字段并单击它。现在我不想在 JPanel 中出现空文本字段,因此我想将按键监听器添加到面板本身。

这是我正在谈论的类(class):

package cookieClicker;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class CookieView extends JPanel
{
private CookieModel cm;
private ImageIcon cookie;
public Rectangle rect;

public CookieView(CookieModel cm)
{
this.cm = cm;
this.setFocusable(true);
this.requestFocusInWindow();
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
cookie = new ImageIcon("Untitled-1.png");
g.setColor(Color.ORANGE);
g.drawImage(cookie.getImage(), this.getWidth() / 2 - 100, this.getHeight() / 2 - 100, 200, 200, this);
rect = new Rectangle(this.getWidth() / 2 - 100, this.getHeight() / 2 - 100, 200, 200);
}

public void addListener(MouseListener m, KeyListener k)
{
this.addMouseListener(m);
this.addKeyListener(k);
}
}

有人知道如何实现这个功能吗?

最佳答案

panel is focused

你怎么知道面板已聚焦?

requestFocusInWindow() 方法仅在调用该方法时框架已经可见时才起作用。因此,在构造函数中调用该方法不会执行任何操作。

基本代码应该是:

CookieView panel = new CookieView();

JFrame frame = new JFrame();
frame.add(panel);
frame.pack();
frame.setVisible(true);
panel.requestFocusInWindow();

此外,您还应该确保所有代码都在事件调度线程上执行。

但是,您可能甚至不应该使用 KeyListener。在大多数情况下,Swing 被设计为与 Key Bindings 一起使用。 。阅读教程以了解按键绑定(bind)是否适合您。

最后,您不应该在paintComponent() 方法中读取图像文件。每当 Swing 确定需要重新绘制组件时,就会调用绘制方法,因此一遍又一遍地读取图像效率很低。

关于java - JPanel 中的 KeyListener 不起作用(面板已聚焦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19364943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com