【问题标题】:Mashing keys causes invalid input混搭键导致无效输入
【发布时间】:2013-02-22 15:55:03
【问题描述】:

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

【问题讨论】:

  • 你没有给我足够的信息。我不知道错误是什么,而且我没有完整的源代码(即使我倾向于阅读它)。我不知道您所说的“无效输入”是什么意思。你显然已经决定这几十行“相关”代码包含一些我可以指出并说“你的问题!”的东西。如果你真的需要帮助,你应该更加努力地为潜在的帮助者提供他们需要的东西。您也可以在标题中提及整体技术(Swing)。

标签: java swing events


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 要将其在活动队列中向上移动,请编辑您的问题以表明您的更改并突出显示剩余的问题。例如,您的意思是检查时间戳吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2018-12-07
    • 2013-08-24
    相关资源
    最近更新 更多