【问题标题】:KeyListener in JPanel not working (panel is focused)JPanel 中的 KeyListener 不起作用(面板已聚焦)
【发布时间】:2013-10-22 07:06:57
【问题描述】:

正如标题所说,我正在尝试将 keylistener 添加到 JPanel。到目前为止,我让它工作的唯一方法是添加一个空的文本字段并单击它。现在我不想在我的 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);
    }
}

有人知道怎么做吗?

【问题讨论】:

标签: java swing jpanel keylistener paintcomponent


【解决方案1】:

面板已聚焦

您如何知道面板已聚焦?

requestFocusInWindow() 方法仅在调用该方法时框架已经可见时才有效。所以在你的构造函数中调用方法不会做任何事情。

基本代码应该是:

CookieView panel = new CookieView();

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多