2017-10-08 56 views
-1

我用Java Swing应用程序,在那里我有一个主框架和多个面板,我将其设定可见或不可见,并在同一时间,我在一个类实例化之间往返工作,其在后台运行一个while循环。现在,问题是:除非while循环结束,否则面板不会出现,但是我希望让用户在while循环在后台继续时单击某些按钮,甚至连他都不知道。这里是我的代码一个小例子:如何实现线程并发性在Java中

 startPage.setVisible(false); 
     lblError.setVisible(false);  
     new QuestionPage(Integer.parseInt(fieldUserID.getText())); 

QuestionPage有一个while循环下去,我想,直到完成不冻结整个应用程序,而是让,虽然在后台循环运行。到目前为止,我尝试通过扩展Thread类来完成2个线程,但我不确定这是否是正确的方式。

[编辑]

这是我使用的SwingWorker以在后台发送while循环这恰好在QuestionPage类和主框架上与摆动操作来进行后NEXT按钮

btnStart.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) {     
      if (validateInput(fieldUserID.getText(), fieldAge.getText(), fieldSex.getSelectedItem().toString(), fieldExperience.getText())) { 
       startPage.setVisible(false); 
       lblError.setVisible(false); 
       SwingWorker worker = new SwingWorker<Void, String>() { 
        @Override 
        public Void doInBackground() { 
         new QuestionPage(Integer.parseInt(fieldUserID.getText())); 
         return null; 
         }       
        };        
      } else { 
       lblError.setVisible(true); 
      }    
     };     
    }); 
+1

Swing不是线程,你不应该从出方在事件调度线程的上下文更新的用户界面。根据您的描述,您正在阻止EDT – MadProgrammer

+0

而不是使用循环,请尝试使用计时器或摆动计时器来安排要执行的操作。 https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html –

+1

我建议你看看[并发在Swing(https://docs.oracle.com/javase/tutorial/ uiswing/concurrency /)以获取更多详细信息。我也建议你添加一个[最小,完整,可验证的示例](https://stackoverflow.com/help/mcve),因为现在,这一切都只是猜测工作 – MadProgrammer

回答

0

[ANSWER]

诀窍是使用SwingWorker在后台发送长时间运行的任务,并且还要在其上调用​​。下面是一个Start按钮事件侦听器的最小工作示例:

// Send long running task in background 
       SwingWorker worker = new SwingWorker<Void, String>() { 
        @Override 
        public Void doInBackground() { 
         new QuestionPage(Integer.parseInt(fieldUserID.getText())); 
         return null; 
         }       
        }; 
        worker.execute();