【发布时间】:2012-03-08 17:46:02
【问题描述】:
对于一个程序,我在按下按钮“1”时使用 KeyListener 向 ArrayList 添加一些内容。此列表中的对象不断被可视化。使用 KeyListener,即使在按住按钮的情况下也能流畅地工作。
后来,我在 GUI 中添加了一个 JMenuBar。向 ArrayList 添加内容现在有一个自己的 JMenuItem,其加速器设置为 KeyStroke '1' 和一个 ActionListener,它执行与之前的 KeyListener 相同的内容。但是,现在的表现非常糟糕。按住“1”会非常滞后,与 KeyListener 相比非常慢。
为什么这么慢?难道我做错了什么?有没有更好的办法?
...
AL al = new AL();
menu.add(createMenuItem("Add", KeyEvent.VK_1, al));
}
private JMenuItem createMenuItem(String text, int key, ActionListener al){
JMenuItem menuItem = new JMenuItem(text);
menuItem.setAccelerator(KeyStroke.getKeyStroke(key, 0));
menuItem.addActionListener(al);
return menuItem;
}
private class AL implements ActionListener{
public void actionPerformed(ActionEvent e){
int keycode = ((JMenuItem)e.getSource()).getAccelerator().getKeyCode();
bla(keycode);
}
}
【问题讨论】:
-
你的
keyPressed(keycode);代码应该做什么? -
它是通过触发关键监听器来做到这一点的吗?
-
来个SSCCE sscce.org
-
是的,我同意提出 SSCCE 的建议。我们大多数人在使用 ActionListener 时都没有遇到“延迟”问题,这使得您使用 ActionListener 不太可能成为问题的根源,更有可能是您的代码发生了其他事情。什么?我不知道,sscce 可以提供帮助。请在回复之前检查链接,因为对于我们所要求的内容存在很多误解,链接已清除。
-
我不知道,因为我没有可以运行、测试、修改和检查的代码。我不知道你在这里回答问题有多久了,但如果你回答了任何时间,你会迅速改变对 sscce 的价值的看法。这取决于您,取决于您真正需要我们帮助的程度。