Java分配给私有int变量会导致KeyListener无法触发

时间:2015-05-13 01:53:48

标签: java swing keylistener

我有一个扩展JPanel并实现KeyListener的类。在构造函数中,我有一个名为fontHeight的变量设置为数字:

public class Main {
    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.setVisible(true);

        Foo panel = new Foo();
        jf.add(panel);

        for (;;) {
            jf.validate();
            jf.repaint();
            Thread.sleep(30);
        }
    }
}

public class Foo extends JPanel implements KeyListener {
    private int fontHeight;
    private String content;
    public Foo() {
        content = "";
        fontHeight = getfontMetrics(getFont()).getAscent();
        addKeyListener(this);
        setFocusable(true);
        System.out.println("this works and sh*t");
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(content, 0, 13);
    }
    public void keyPressed(KeyEvent e) {
        content += e.getKeyCode();
    }
}

当我运行它时,它会打印it works and sh*t。所以它不会卡在构造函数中。它也不是它没有重新粉刷;如果我添加一行代码以在content的末尾向paintComponent添加字符,则会绘制扩展字符串。

如果我注释掉fontHeight =行,它会正常工作。我没有得到的是如何分配给变量会导致KeyListener无法运行。我只是错过了一些非常简单的东西吗?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

将此方法添加到您的Foo类:

0045$002,34234 = 234234
$000300 = 300
$000387687 = 387687
$000 = 0
$00 = 0
$0 = 0

这告诉它,只要它被添加到JFrame,它就会实际请求焦点(而不是仅仅是可聚焦的)。焦点是一个巨大的痛苦,它使Swing编程方式比它需要的更加混乱。