正如标题所说,我试图为JPanel添加一个keylistener。到目前为止,我使用它的唯一方法是添加一个空文本字段并单击它。现在我不想在我的JPanel中有一个空的文本字段,所以我想将keylistener添加到面板本身。
这是我正在谈论的课程:
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);
}
}
有谁知道如何使这项工作?
答案 0 :(得分:4)
小组专注于
您如何知道专家组的重点?
requestFocusInWindow()
方法仅在调用方法时帧已经可见时才有效。因此,在构造函数中调用该方法将不会执行任何操作。
基本代码应为:
CookieView panel = new CookieView();
JFrame frame = new JFrame();
frame.add(panel);
frame.pack();
frame.setVisible(true);
panel.requestFocusInWindow();
此外,您应该确保所有代码都在Event Dispatch Thread上执行。
但是,您甚至可能不使用KeyListener。在大多数情况下,Swing旨在与Key Bindings一起使用。阅读教程,了解密钥绑定是否适合您。
最后,您不应该在paintComponent()方法中读取Image文件。只要Swing确定需要重新绘制一个组件,就会调用绘制方法,因此无法一遍又一遍地读取图像。