Mashing键导致无效输入

时间:2013-02-22 15:55:03

标签: java swing events

我通过在数字键盘上基本上混合键来演示我的程序,以便在那里快速获得一些虚拟数据,并发现偶尔会导致输入无效输入。这似乎是某种线程问题,但我对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();
    }
}

2 个答案:

答案 0 :(得分:3)

你几乎肯定会使用Key Bindings。箭头键通常默认绑定到滚动窗格操作,您可以按照here所示自行唤起这些操作。另请考虑实施Scrollable接口。

如果您使用Key Listener,请注意这一重要区别:当按键按下后按键释放时会发生keyTyped()“事件。” KeyEventDemo说明了事件是如何交错的。

答案 1 :(得分:2)

原来问题是一个不起眼的计时器任务,它调用repaint()并且不是线程安全的。此外,我应该使用javax.swing.Timer而不是java.util.Timer,因为线程安全问题是处理swing组件。我仍然对我的问题的自动测试部分的答案感兴趣。