2016-08-07 10 views
0

whileループを開くボタンがあるので、whileループが終了するまで私のGUI全体がフリーズします。 Swingのオブジェクトはスレッドセーフではありませんので、お時間のある後の時点で実行されるタスクを可能にSwingUtilities.invokeLater()を設けているので、明らかだJavaどのようにGUIをスレッドするのですか

JButton Test= new JButton(); 
Test.setText("Test"); 
Test.setSize(230, 40); 
Test.setVisible(true); 
Test.setLocation(15, 290); 

Test.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e){ 
int x = 0; 
while(x<500){ 
    x++ 
}); 
+0

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – whyn0t

+0

一般的なJavaの命名法(命名規則を学ぶしてください'UPPER_CASE_CONSTANT')、それを一貫して使用してください。 –

答えて

1

使用ExecutorServiceクラス

Test.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      ExecutorService es = Executors.newCachedThreadPool(); 
      es.submit(new Runnable() { 
       @Override 
       public void run() { 
        int x = 0; 
        while (x < 500) { 
         x++; 
        } 
       } 
      }); 
     } 
}); 
+1

* "どのように毎秒更新するために私のGUIをスレッドするのですか?" *質問をしている人が提供するサンプルコードは、 '重い吊り上げ'ループでは更新しようとしても全く失敗したGUI!これを行うには、「GUIを更新する」ことがEDTで行われるべきですが、重い持ち上げ自体はEDTから行われるべきです。このように最も最適な答えは 'SwingWorker'を使うことを示唆している[this one](http://stackoverflow.com/a/38813650/418556)です。作業者はEDTコードの両方と&offを扱います。 –

+1

@AndrewThompsonあなたは正しい、良い観察です。 – avonnadozie

2

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     int x = 0; 
     while(x<500){ 
      x++ 
     } 
    } 
}); 
3

大きなアイデアは、あなたがGUIの描画の責任あるスレッドで重い治療を行っているので、あなたのGUIがフリーズということです。その解決策は、バックグラウンドで実行されるスレッドに時間がかかりやすい計算や処理を委任することです。それがない限り、例えば、 `EachWordUpperCaseClass`、` firstWordLowerCaseMethod() `、` firstWordLowerCaseAttribute` - https://docs.oracle.com/javase/tutorial/uiswing/concurrency/

関連する問題