2013-02-22 28 views
1

我通過基本上在數字鍵盤上混合鍵來顯示我的程序,以真正快速地獲得一些虛擬數據,並發現偶爾會導致輸入無效輸入。這似乎是某種線程問題,但我對Swing事件的理解是,它們基本上是從同一個線程中按順序觸發的。我沒有明確地創建自己的任何線程,但我正在使用paintComponent(Graphics g)進行大量自定義繪製。大多數按鍵最終會在堆棧中觸發深度爲repaint()。這可能會導致我的問題?爲什麼?如果是這樣,任何想法如何解決它?如果沒有,還有什麼想法呢?Mashing鍵導致無效輸入

此外,有沒有人知道如何爲此做一個自動化測試?下面顯示了相關的事件處理程序。

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(); 
    } 
} 
+0

你沒有給我足夠的信息。我不知道錯誤是什麼,並且我沒有完整的源代碼(即使我傾向於閱讀它)。我不知道「無效輸入」是什麼意思。你顯然已經決定這些幾十行的「相關」代碼包含一些我可以指向的內容,並說「有你的問題!」。如果你真的需要幫助,你應該更加努力地給潛在的幫助者他們需要什麼。您也可以在標題中提及整體技術(Swing)。 – arcy 2013-02-22 16:10:22

回答

3

您幾乎可以肯定會使用Key Bindings。箭頭鍵通常默認綁定爲滾動窗格操作,您可以自己調用這些操作,如here所示。還要考慮實施Scrollable接口。

如果您使用Key Listener,請注意以下本質區別:當按鍵後按鍵釋放時發生「keyTyped()」事件。 KeyEventDemo說明事件是如何交錯的。

2

原來的問題是一個不起眼的計時器任務,稱爲repaint()並且不是線程安全的。此外,我應該使用javax.swing.Timer而不是java.util.Timer,因爲線程安全性問題涉及到擺動組件。我仍然對我的問題的自動化測試部分的答案感興趣。

+0

要將它在活動隊列中向上移動,請編輯您的問題以指示您的更改並突出顯示剩餘問題。例如,你的意思是檢查時間戳嗎? – trashgod 2013-02-22 19:04:56

相關問題