Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Swing_Jframe_Jpanel - Fatal编程技术网

如何在Java中实现线程并发

如何在Java中实现线程并发,java,multithreading,swing,jframe,jpanel,Java,Multithreading,Swing,Jframe,Jpanel,我正在使用一个JavaSwing应用程序,其中有一个主框架和多个面板,通过设置它们是否可见,我可以在它们之间进行转换,同时,我正在实例化一个在后台运行while循环的类。现在,问题是:除非while循环结束,否则面板不会出现,但我想让用户在while循环在后台继续时单击一些按钮,甚至他都不知道这一点。下面是我的代码的一个小示例: startPage.setVisible(false); lblError.setVisible(false);

我正在使用一个JavaSwing应用程序,其中有一个主框架和多个面板,通过设置它们是否可见,我可以在它们之间进行转换,同时,我正在实例化一个在后台运行while循环的类。现在,问题是:除非while循环结束,否则面板不会出现,但我想让用户在while循环在后台继续时单击一些按钮,甚至他都不知道这一点。下面是我的代码的一个小示例:

        startPage.setVisible(false);
        lblError.setVisible(false);     
        new QuestionPage(Integer.parseInt(fieldUserID.getText()));
QuestionPage
有一个while循环,我不想在完成之前冻结整个应用程序,而是让while循环在后台运行。到目前为止,我通过扩展Thread类尝试了两个线程,但我不确定这是否是正确的方法

[编辑]

这是我使用SwingWorker后的
NEXT
按钮,用于在后台发送在
QuestionPage
类中发生的while循环,并在主框架上执行swing操作

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);
            }               
        };                  
    });
btnStart.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(validateInput(fieldUserID.getText()、fieldAge.getText()、fieldSex.getSelectedItem().toString()、fieldExperience.getText()){
起始页设置可见(假);
lblError.setVisible(假);
SwingWorker worker=新SwingWorker(){
@凌驾
公共无效doInBackground(){
新的问题页面(Integer.parseInt(fieldUserID.getText());
返回null;
}                           
};                             
}否则{
lblError.setVisible(真);
}               
};                  
});
[答案]

诀窍是使用SwingWorker在后台发送长时间运行的任务,并对其调用
execute()
。下面是
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();
//在后台发送长时间运行的任务
SwingWorker worker=新SwingWorker(){
@凌驾
公共无效doInBackground(){
新的问题页面(Integer.parseInt(fieldUserID.getText());
返回null;
}                           
};
worker.execute();

Swing不是线程,您不应该从事件调度线程的上下文外部更新UI。根据您的描述,您正在阻止EDT而不是使用循环,请尝试使用计时器或Swing计时器来计划要执行的操作。我建议你看一看,了解更多细节。我还鼓励你添加一个,因为现在,这都是猜测工作为了理解你的答案@madprogrammer,我遵循了这个教程,我了解了SwingWorkers。这就是你的回答所指的吗?你的问题的答案取决于你试图达到的目标,因为这个问题缺乏足够的背景,不可能为你提供一个具体的答案。
SwingWorker
或Swing
定时器可能会解决您的问题