2017-02-13 1 views
0

ハンドル私は機能offlineClickedがためにおおよその周り1分を取る同時イベントのJava Swingのイベントハンドラ

JRadioButton offline = new JRadioButton(); 
    offline.setText("Offline Mode"); 

    modePanel.add(offline); 

    modePanel.setLayout(new GridLayout(2,1)); 
    offline.addMouseListener(new java.awt.event.MouseAdapter() { 
       public void mouseClicked(java.awt.event.MouseEvent evt) { 
        offlineClicked(evt); 
       } 
      }); 

JPanelJRadioButtonを追加し、そのマウスクリックイベントを処理する次Javaコードを持っています完全に実行されます。 実行が完了するまで、実行された他のアクションは処理されません。

その後に実行されるすべてのアクションは、offlineClickedの実行が完了すると、Eventqueueに行き、FIFOを処理したように見えます。

このため、UI は、がハング状態になっているようです。

スイングハンドルイベントを同時に実行し、最後が完全に実行されるまで待つことはできません。

+3

標準的な手法は、イベントスレッドでアプリケーションの作業を絶対にしないことです。 UIが応答性を保つことができるように、アプリケーション処理を常に別の処理スレッドで実行します。このテーマでは書籍やチュートリアルが全部入手できますが、いくつかのGoogle検索を行います。 Oracleのチュートリアルから始めてください。 –

+2

ボタンのSwingWorkerとActionListenerを探しています。 [(SwingWorkerの)()のような)](http://stackoverflow.com/questions/20944719/how-to-use-swingworker/20945255#20945255) – MadProgrammer

+0

すべてのクリックが処理されることは不可欠ですか?または、最初のクリックの最初の処理が完了するまで、クリックを無視したいですか? - (SwingWorkerなどを使用していても)並行ソリューションを実装する際には、これを考慮する必要があります。 – Fildor

答えて

0

mouselistenerイベントが発生すると、イベントディスパッチスレッド(画面を再描画するスイングGUI)で実行されます。あなたがGUIスレッドにロジックコードを入れたら、ロジックが完了してGUIスレッドを振り戻すまであなたのGUIはフリーズします。 swingworkerを使用することも、別のオプションを使用することもできます。単に新しいスレッドを開始し、他のGUIイベントを処理できるようにGUIスレッドを戻すことができます。新しいスレッドでは、時間のかかるロジックを実行します。イベントループを実行しているため、スイングは非同期で実行されているため、フリーズしません。ディスパッチスレッドですべてのスイングコードを実行する必要があります。ディスパッチスレッド上にロジックが終了した後は、イベントキューに追加する必要があります。

java.awt.EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     // you can now safely use swing components 
     new frame.setVisible(true); 
    } 
});