2017-07-25 3 views
0

私はリアルタイムの株価GUI Javaアプリケーションで奇妙な問題を経験しました。 問題は、このコードです: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アプリケーションは、アップ/ダウンテーブルをスクロールしたとき遅れ、非常に遅くなります。 修正は、スイングスレッドからコードを呼び出すように思われます。

間違ったスレッドがそれを呼び出すとどうなりますか?

答えて

1

修正は、スレッドをスイングからコードを呼び出すように見えます。

実際には、Event Dispatch Thread (EDT)ではなく、別のスレッドから処理ロジックを呼び出すことです。 EDTは、イベントへの応答とGUIのペインティングを担当するSwing Threadであるため、長時間実行されるコードを実行しないでください。そうしないと、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