Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 如何在actionlistener中按顺序执行任务_Java_Swing_Actionlistener - Fatal编程技术网

Java 如何在actionlistener中按顺序执行任务

Java 如何在actionlistener中按顺序执行任务,java,swing,actionlistener,Java,Swing,Actionlistener,我想在actionlistener中按特定顺序执行任务。在我的代码中,当按钮上的主要任务执行时,我希望在操作中显示加载图标。但是,当我按下d按钮时,所有操作都同时完成。。我希望JLabel img在执行数据库连接任务之前显示我的图像。这是我的代码 take.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent ev){ img.set

我想在actionlistener中按特定顺序执行任务。在我的代码中,当按钮上的主要任务执行时,我希望在操作中显示加载图标。但是,当我按下d按钮时,所有操作都同时完成。。我希望JLabel img在执行数据库连接任务之前显示我的图像。这是我的代码

take.addActionListener(new ActionListener(){
        @Override
    public void actionPerformed(ActionEvent ev){
       img.setIcon(image);
        Calendar cal = Calendar.getInstance();
                 cal.add(Calendar.DATE, 1);
                 SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
                 String formatted = format1.format(cal.getTime());
       String dname = (String)doclist.getSelectedItem();
        try{
            db.connect();

    rs=db.stmt.executeQuery("Select * from table4 where name='"+dname+"'");
          rs.next();
             final String id=rs.getString("dr_id");
             String mst=rs.getString("mor_start");
             String est=rs.getString("eve_start");
             int mmax=rs.getInt("mor_max");
             int emax=rs.getInt("eve_max");
             int mava=rs.getInt("mor_ava");
             int eava=rs.getInt("eve_ava");
          }});

使用
SwingWorker
。有关更多信息,请阅读Swing教程中的部分。

您可以使用@camickr所说的
SwingWorker
。这里有一个完整的。其思想是在另一个后台线程中运行某些进程,而不是在与GUI不同的线程中。图形用户界面的东西在数据库中运行

这里有一个例子:

class Worker extends SwingWorker<Void, String> {

   private JLabel labelToUpdate;
   private final String dname;    


    public Worker(JLabel label, String dname){
         super();
         this.labelToUpdate=label;
         this.dname=dname;
    }

    @Override
    protected void doInBackground() throws Exception {
       //here you make heavy task this is running in another thread not in EDT                 
       //  you connect to the db and make the query you can call
       // publish("connectin to the db") and this will call process

       // Connection con = ...
    }

    @Override
    protected void process(List<String> chunks) {
        StringBuilder sb = new StringBuilder();
        for(String chunk : chunks){
           sb.append(chunk).append("\n");
        }
          labelToUpdate.setText(sb.toString());        
    }

   //Executed on the Event Dispatch Thread after the doInBackground method is finished
   @Override
   protected void done(){
      labelToUpdate.setIcon(null);
   }
}

你能用我的示例plss更具体一点吗。。这将是非常有帮助的,以及如何传递参数,如dname和许多其他在中执行查询所需的参数db@user2984132您可以创建一个包装类,将其作为属性,或者将其作为swingWorker的属性,并通过构造函数或setter传递它,就像我对标签所做的那样;),如果你不理解我的观点,请告诉我,请用我的例子解释。。我很困惑。。告诉我在这两个阶段该做什么sides@user2984132,这就是我为什么不填鸭式回答的原因。OP没有学到任何东西,他们一直在问问题。教程和论坛中都有大量使用SwingWorker的示例。不要期望别人为你写代码。发布显示您尝试执行的操作的代码。那么也许我们可以帮助解决这个问题。这称为
SSCCE
take.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent ev){
          String dname = (String)doclist.getSelectedItem();
          SwingWorker worker = new Worker(label,dname);
          label.setIcon(image);
          worker.execute();  
    }
);