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 に答える