【发布时间】: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