Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使按钮摆动以进行大的治疗_Java_Swing - Fatal编程技术网

Java 如何使按钮摆动以进行大的治疗

Java 如何使按钮摆动以进行大的治疗,java,swing,Java,Swing,我需要使用Swing创建一个windows界面来启动java应用程序,问题是治疗时间太长,所以当我点击按钮启动它时,界面崩溃,直到治疗完成我才能得到任何回报!!我不知道我是否能很好地解释这个问题,我需要帮助,所以任何人都有想法请帮帮我你可以使用SwingWorker来完成这项任务,该SwingWorker设计用于在另一个线程中运行大量任务,而不会阻塞gui。这是一个我非常喜欢的完整例子 例如: class Worker extends SwingWorker<Void, String>

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

你可以使用
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线程模型,因为出错可能会破坏您的程序

进一步阅读:


之所以发生这种情况,是因为所有Swing操作都是在EDT(事件调度线程)上处理的

当该线程忙于单击按钮时,它不能做任何其他事情,例如更新用户界面、响应更多的单击等

实现这一点的方法是使用
SwingWorker
或使用类似
ExecutorService
的东西来创建一个新线程来处理处理

一旦该线程完成(或者在处理过程中,如果您想进行定期更新),它就可以使用
SwingUtilities.invokeLater
将结果发送回Swing线程以更新用户界面

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

在开始之前,您确实需要阅读Swing线程模型,因为出错可能会破坏您的程序

进一步阅读:


您正在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中执行一项长任务

您可以尝试另一种方法:

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。