如何制作按钮Swing进行大治疗

时间:2013-12-06 13:04:35

标签: java swing

我需要使用Swing创建一个Windows界面来启动一个java应用程序,问题是处理时间太长,所以当我点击按钮启动它时,界面崩溃,我无法获得任何返回,直到治疗结束!!我不知道我是否能很好地解释这个问题,我需要帮助,所以任何人都有一个想法可以帮助我

3 个答案:

答案 0 :(得分:2)

你可以使用SwingWorker来设法在另一个线程中运行大量任务而不会阻止gui。这是一个我非常喜欢Swing Worker Example

的完整示例

示例:

class Worker extends SwingWorker<Void, String> {

    @Override
    protected Void doInBackground() throws Exception {
       //here you make heavy task this is running in another thread not in EDT


      return null;
    }

   @Override
   protected void done() {
        //this is executed in the EDT            
   }
}

doInBackground方法完成后,执行done方法。您也可以阅读publish(..)process(..)

了解更多SwingWorker

答案 1 :(得分:1)

这是因为所有Swing操作都在EDT(事件调度线程)上处理。

当该线程忙于完成单击按钮的工作时,它无法执行任何其他操作,例如更新用户界面,响应更多点击等。

执行此操作的方法是使用SwingWorker或使用ExecutorService之类的内容创建新线程来处理处理。

一旦该线程完成(或者在处理期间,如果您想要定期更新),则可以使用SwingUtilities.invokeLater将结果发送回Swing线程以更新用户界面。

请注意,通过这样做,您可以让用户在等待时执行其他操作 - 这可能包括再次单击按钮。在这种情况下,您需要考虑您希望程序执行的操作。一种常见的方法是在单击按钮后禁用按钮,然后在处理完成后再次启用它。

你真的需要在开始之前阅读Swing线程模型,因为弄错可能会破坏你的程序。

进一步阅读:

答案 2 :(得分:1)

你在EDT执行一项长期任务。

您可以尝试其他方法:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class LongTask {

   public static void main(String[] args) {
      JFrame myFrame=new JFrame("Test");
      JButton myButton=new JButton("Click");
      myFrame.add(myButton);
      myButton.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e){
            Thread t=new Thread(new Runnable(){
               public void run(){
                  //Perform long task
                  //update UI using SwingUtilities.invokeLater(...);
               }
            });
            t.start();
         }
      });
      myFrame.pack();
      myFrame.setVisible(true);
   }

}