1

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

2 回答 2

3

您几乎可以肯定使用Key Bindings。默认情况下,箭头键通常绑定到滚动窗格操作,您可以自己调用这些操作,如此处所示。还要考虑实现Scrollable接口。

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

于 2013-02-22T16:24:59.517 回答
2

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

于 2013-02-22T16:56:19.183 回答