【问题标题】:Java assigning to private int variable causes KeyListener not to fireJava分配给私有int变量导致KeyListener不触发
【发布时间】:2015-05-13 01:53:48
【问题描述】:

我有一个扩展 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。所以它不会卡在构造函数中。也不是不重画;如果我添加一行代码在paintComponent 的末尾添加一个字符到content,它会绘制扩展字符串。

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

【问题讨论】:

  • 如果您调用getfontMetrics(getFont()).getAscent(); 并且不将其分配给变量,它是否有效?也许 getFontMetrics 的某些东西正在阻止它。
  • String + int?考虑提供一个可运行的示例来演示您的问题
  • @Vincent 我在没有分配的情况下尝试了它,但它仍然没有用。正如您所说,这似乎是 getFontMetrics 的问题。
  • Thread.sleep(...)?无限循环?不,不要那样做,不要投票。而是倾听并通知。
  • @tsuzuki 你的for-loop 让我害怕,因为它有可能阻止 EDT。仅仅因为某些东西是可聚焦的,并不意味着它会得到焦点。给Foo添加一个MouseListener,这样点击的时候就可以调用requestFocusInWindow。在您的 keyPressed 方法中,添加调试语句以确保已调用它并添加对 repaint 的调用以重新绘制面板。我们使用键绑定 API 代替 KeyListener,它将解决键盘焦点问题

标签: java swing keylistener


【解决方案1】:

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

@Override
public void addNotify() {
    super.addNotify();
    requestFocusInWindow();
}

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

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多