我在演示程序时,基本上是通过敲击数字键盘上的键来真正快速地在其中获得一些虚拟数据,然后发现偶尔会导致输入无效的输入。似乎是某种线程问题,但是我对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();
    }
}

最佳答案

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

如果使用Key Listener,请注意以下基本区别:keyTyped()“在按键后释放键时发生事件”。 KeyEventDemo说明了事件如何交错。

07-24 17:50