2016-05-20 4 views
0

GUIを持つ複雑なJavaプログラムを作成しました。プログラムは非常に遅く実行され、Thread.sleepは無視されます

GUIには、「再生」、「すべて再生」、「リセット」の3つのボタンといくつかの表があります。

私が再生をクリックすると、プログラムはロジックを実行し、出力を前述のテーブルに出力します。これは意図したとおりにうまく動作しています。一定量の「再生」操作の後、すべてのデータをテーブルに印刷したので、完了したので、これ以上クリックすることはできません。その時点で、私は再生ボタンを無効にします。

私はすべてをクリックすると、それはもはや可能になるまで "再生"をクリックしたようにしたい。だから私はこのコードを書いた:

public synchronized void actionPerformed(ActionEvent event) 
{ 
    if(event.getSource() == playAllButton) 
    { 
     while(playButton.isEnabled()) 
     { 
      playButton.doClick(); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
    if(event.getSource() == playButton) 
    { 
     Command command = listOfCommands.get(commandNumber++); 
     if(command.getCommandType() == "PF") 
     { 
      PFLabel.setText("PF Count:" + (++PFCount)); 
     } 
     if(command.getCommandType() == "PR") 
     { 
      PRLabel.setText("PR Count:" + (++PRCount)); 
     } 
     if(command.getCommandType() == "GP") 
     { 
      if(checkIfPF()) 
      { 
       addPageToRam(((GPCommand)command).getPage()); 
      } 
      else 
      { 
       if(checkIfPR(((GPCommand)command).getPage().getPageId())) 
       { 
        replacePage(((GPCommand)command).getPage(),getWithWhoToReplace(((GPCommand)command).getPage().getPageId())); 
       } 
      } 
     } 
    } 
    if(commandNumber == listOfCommands.size()) // we are done! 
    { 
     playButton.setEnabled(false); 
    } 
} 

私が言及したように、私が再生ボタンをクリックすると、それは意図したとおりに結果をすぐに印刷します。 しかし、私がすべてをクリックすると、出力を表示せずに非常に長い時間実行され、最後に最終結果だけが表示されます。これは私が望むものではありません。私が欲しいのは、現在の結果を印刷して少し見て、それを見てから次の結果を印刷することです。

Thread.sleepを削除しても、非常に遅く(最後の結果しか表示されません)。

これを実行する方法はありますか?さらに重要なことは、ボタンをもう一度クリックする前に、どうすればいいのですか?私はそれが再びクリックされる前にしばらくの間、現在の結果を見たいと思う。

+0

文字列を '=='と比較するのは普通ですか? 'command.getCommandType()==" PF "' – Tunaki

+0

はい、それは正常で意図どおりの動作です。 –

+0

私はそれを修正しても(私はそれを感謝します)、現在の問題をどのように助けますか? –

答えて

1

コメント欄では、SwingWorkersを使用して長時間実行するコードを非同期タスクに移行することで問題を解決できることがわかりました。氏Coobirdは方法を投稿しました、これを行う方法here

+1

はい。制限された速度のループスレッドの錯覚を与えるためにThread.sleepを使用するべきではありません。そうした場合、スリープ時間が終了するまでプロセス全体が停止します。 – GingerDeadshot

+0

SwingWorkerを使ってもっと簡単なプログラムを使って試してみました(ボタンの 'doClick()'メソッドを使って10までカウントしています)。たとえそれを遅くするような方法を追加しなくても、数を数えることもできます(かなり高速です)。しかし、それがカウントしている間にデータを確認できるように、しばらくの間スリープ状態にすることも可能です。リンクを投稿してくれてありがとう、以前はSwingWorkerについて知りませんでした。 –

関連する問題