我通过在数字键盘上基本上混合键来演示我的程序,以便在那里快速获得一些虚拟数据,并发现偶尔会导致输入无效输入。这似乎是某种线程问题,但我对Swing事件的理解是它们基本上是从同一个线程顺序触发的。我没有明确创建自己的任何线程,但我正在使用paintComponent(Graphics g)
进行大量自定义绘制。大多数按键最终会在堆栈中触发repaint()
深。这会导致我的问题吗?为什么?如果是这样,任何想法如何解决它?如果没有,任何想法可能是什么?
此外,有谁知道如何进行自动化测试?相关事件处理程序如下所示。
public void keyTyped(KeyEvent e)
{
if (e.getKeyChar() == myKeyChar)
runPrimaryFunction(); // Does some calculations and triggers a repaint
}
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == myKeyCode)
runPrimaryFunction();
}
/********* Another class listening to the same JFrame ********/
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_UP)
{
scrollUp();
repaint();
}
else if (e.getKeyCode() == KeyEvent.VK_DOWN)
{
scrollDown();
repaint();
}
}
答案 0 :(得分:3)
你几乎肯定会使用Key Bindings。箭头键通常默认绑定到滚动窗格操作,您可以按照here所示自行唤起这些操作。另请考虑实施Scrollable
接口。
如果您使用Key Listener,请注意这一重要区别:当按键按下后按键释放时会发生keyTyped()
“事件。” KeyEventDemo
说明了事件是如何交错的。
答案 1 :(得分:2)
原来问题是一个不起眼的计时器任务,它调用repaint()
并且不是线程安全的。此外,我应该使用javax.swing.Timer
而不是java.util.Timer
,因为线程安全问题是处理swing组件。我仍然对我的问题的自动测试部分的答案感兴趣。