2017-07-25 120 views
0

我在我的實時股票GUI GUI應用程序中遇到了一個奇怪的問題。 問題是這樣的代碼:Java Swing UIManger導致速度緩慢

InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 

如果從主線程中調用它的整個GUI應用程序變得很慢,滾動表時向上/向下滯後。 修復似乎是從Swing線程調用代碼。

當錯誤的線程調用它時發生了什麼?

回答

1

該修復似乎是從Swing線程調用代碼。

其實修復是從一個單獨的線程調用處理邏輯,而不是Event Dispatch Thread (EDT)。 EDT是負責響應事件並繪製GUI的Swing線程,因此它不應該執行長時間運行的代碼或GUI變得無響應。

閱讀有關Concurrency的Swing教程的部分以獲取更多信息。您可以使用SwingWorker執行長時間運行的代碼。

+0

看到我上面的答案,謝謝 – vmuser

0

該應用程序非常快速,每天用於許多期貨和期權市場的交易。我們發現,當特定按鈕聚焦時,空格鍵會導致意外點擊。因此我們附帶了焦點輸入貼圖修復。然而,從非EDT線程調用這個「修復」會導致整個應用程序以「跛行」模式運行,這很瘋狂。

這與任何處理或比賽無關。這裏是更多的上下文:

//SLOW: 
public static void main(String[] args) 
{ 
    InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
    im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
    im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 

    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      //just GUI no processing, no changes 
      startAndRunGUI(); 
     } 
    } 
} 
//FAST: 
public static void main(String[] args) 
{ 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

      InputMap im = (InputMap)UIManager.get("Button.focusInputMap"); 
      im.put(KeyStroke.getKeyStroke("pressed SPACE"), "none"); 
      im.put(KeyStroke.getKeyStroke("released SPACE"), "none"); 


      //just GUI no processing, no changes 
      startAndRunGUI(); 
     } 
    } 
} 
+0

這段代碼的重點是什麼?我什麼也沒做。 – camickr