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