Java 如何使按钮摆动以进行大的治疗
我需要使用Swing创建一个windows界面来启动java应用程序,问题是治疗时间太长,所以当我点击按钮启动它时,界面崩溃,直到治疗完成我才能得到任何回报!!我不知道我是否能很好地解释这个问题,我需要帮助,所以任何人都有想法请帮帮我你可以使用Java 如何使按钮摆动以进行大的治疗,java,swing,Java,Swing,我需要使用Swing创建一个windows界面来启动java应用程序,问题是治疗时间太长,所以当我点击按钮启动它时,界面崩溃,直到治疗完成我才能得到任何回报!!我不知道我是否能很好地解释这个问题,我需要帮助,所以任何人都有想法请帮帮我你可以使用SwingWorker来完成这项任务,该SwingWorker设计用于在另一个线程中运行大量任务,而不会阻塞gui。这是一个我非常喜欢的完整例子 例如: class Worker extends SwingWorker<Void, String>
SwingWorker
来完成这项任务,该SwingWorker设计用于在另一个线程中运行大量任务,而不会阻塞gui。这是一个我非常喜欢的完整例子
例如:
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
}
}
类工作者扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
//在这里,您需要执行繁重的任务,这是在另一个线程中运行的,而不是在EDT中
返回null;
}
@覆盖
受保护的void done(){
//这是在EDT中执行的
}
}
doInBackground
方法完成后,执行done
方法。此外,您可能还想阅读有关publish(…)
和process(…)
的内容
阅读更多您可以使用
SwingWorker
来完成此任务,该SwingWorker设计用于在另一个线程中运行大量任务,而不会阻塞gui。这是一个我非常喜欢的完整例子
例如:
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
}
}
类工作者扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
//在这里,您需要执行繁重的任务,这是在另一个线程中运行的,而不是在EDT中
返回null;
}
@覆盖
受保护的void done(){
//这是在EDT中执行的
}
}
doInBackground
方法完成后,执行done
方法。此外,您可能还想阅读有关publish(…)
和process(…)
的内容
阅读更多信息发生这种情况是因为所有Swing操作都是在EDT(事件调度线程)上处理的 当该线程忙于单击按钮时,它不能做任何其他事情,例如更新用户界面、响应更多的单击等 实现这一点的方法是使用
SwingWorker
或使用类似ExecutorService
的东西来创建一个新线程来处理处理
一旦该线程完成(或者在处理过程中,如果您想进行定期更新),它就可以使用SwingUtilities.invokeLater
将结果发送回Swing线程以更新用户界面
请注意,这样做可以让用户在等待时执行其他操作,包括再次单击按钮。在这种情况下,您需要考虑您希望程序做什么。一种常见的方法是,单击按钮后禁用该按钮,然后在处理完成后再次启用该按钮
在开始之前,您确实需要阅读Swing线程模型,因为出错可能会破坏您的程序
进一步阅读:
SwingWorker
或使用类似ExecutorService
的东西来创建一个新线程来处理处理
一旦该线程完成(或者在处理过程中,如果您想进行定期更新),它就可以使用SwingUtilities.invokeLater
将结果发送回Swing线程以更新用户界面
请注意,这样做可以让用户在等待时执行其他操作,包括再次单击按钮。在这种情况下,您需要考虑您希望程序做什么。一种常见的方法是,单击按钮后禁用该按钮,然后在处理完成后再次启用该按钮
在开始之前,您确实需要阅读Swing线程模型,因为出错可能会破坏您的程序
进一步阅读:
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);
}
}
您正在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);
}
}
如果您不知道界面崩溃的原因,请搜索EDT(事件调度线程),您可能还不知道如何在新的
线程中启动此处理定义您的治疗操作并显示您尝试的代码,以帮助我们认为您对正在解决的问题了解甚少。如果您不知道接口崩溃的原因,请搜索EDT(事件调度线程),您可能是新的线程启动此治疗的新手定义您的治疗操作,并显示您尝试的代码,以帮助我们认为您对正在解决的问题了解很少。这肯定有效,但我不确定SwingWorker
是否设计用于执行类似启动另一个java应用程序的任务。。。ExecutorService
可能更适合这种情况,不是吗?@Nizil我不明白他必须启动另一个java应用程序的问题。。想想看,他想做一个很长的任务,你也可以使用executorService和swingworker。它当然可以工作,但我不确定swingworker是否设计用于执行类似启动另一个java应用程序的任务。。。ExecutorService
可能更适合这种情况,不是吗?@Nizil我不明白他必须启动另一个java应用程序的问题。。只要想想他想做一个很长的任务,你也可以和一个swingworker一起使用executorService。