Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.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 将进度条添加到Swing项目_Java_Swing_Constructor_Progress Bar_Swingworker - Fatal编程技术网

Java 将进度条添加到Swing项目

Java 将进度条添加到Swing项目,java,swing,constructor,progress-bar,swingworker,Java,Swing,Constructor,Progress Bar,Swingworker,我为这项工作重新设计了代码。应用程序的最后情况如下所示 GUI类 第二类:工作人员 package exampleproject; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingWo

我为这项工作重新设计了代码。应用程序的最后情况如下所示

GUI类

第二类:工作人员

package exampleproject;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.SwingWorker;

public class MySwingWorker extends SwingWorker<Void, Void> {

        private GUI myGui; //Reach GUI variables.

        public MySwingWorker(GUI myGui) {
        this.myGui = myGui; 
        }

        private MySwingWorker swing;

        public MySwingWorker() {
        this.swing = swing;
        }


        //get start date from GUI and convert it wanted format.
        public String getStartDate (){
        String inputStringDate = myGui.StartDateComboBox.getText();
        SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy");
        Date inputDate = null;
        try {
            inputDate = inputFormat.parse(inputStringDate);
        } 
        catch (ParseException ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 00:00:00.000");
        String outputStringDate = outputFormat.format(inputDate);
        return outputStringDate;
        }

        //get end date from GUI and convert it wanted format.
        public String getEndDate (){
        String inputStringDate = myGui.EndDateComboBox.getText();
        SimpleDateFormat inputFormat = new SimpleDateFormat("dd.MM.yyyy");
        Date inputDate = null;
        try {
            inputDate = inputFormat.parse(inputStringDate);
        } 
        catch (ParseException ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }
        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd 23:59:59.999");
        String outputStringDate = outputFormat.format(inputDate);
        return outputStringDate;
        }

    @Override
    protected Void doInBackground() throws Exception {
        int i = 0;
        setProgress(i);

        String test1 = "Starting Date: '"+getStartDate()+"'"; //LongTask 1
        System.out.println(test1);
        while(i < 50){
             setProgress(i++);
             Thread.sleep(5); // random magic number
        }


        String test2 = "Ending Date: '"+getEndDate()+"'"; //LongTask 2
        System.out.println(test2);
        while(i < 100){
             setProgress(i++);
             Thread.sleep(5); // random magic number
        }

     return null;

    }

}
当程序启动时,GUI屏幕出现在屏幕上,用户选择两个日期并按GO buton

当我按下按钮时,Swingworker成功地从GUI屏幕获取用户选择的值,并将结果打印到屏幕上。我只是想把进度监视器添加到这个项目中

我只想在GUI上点击GO按钮时,屏幕上会出现一个进度监视器,并显示工作人员的状态。但我不知道如何在这个项目中实施全新的progressmonitor框架,并说“听工人的话”


谢谢。

这与您以前的类似。我建议你使用SwingWorker,你做到了,很好

但是你没有注意到这一点。我用。在我在匿名类中使用的代码中。 当您调用swingWorker
setProgress
as
progress
时,它是一个绑定属性,然后当您使用
setProgress
its更改该值时,它会通知它的所有侦听器

我给你举了个简单的例子

public class GUI {

    private JPanel panel;
    private JProgressBar progressBar;
    private JButton button;

    public GUI(){
        panel = new JPanel();
        progressBar = new JProgressBar();
        button = new JButton("Press me");
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                SwingWorker worker = new MySwingWorker();
                worker.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(final PropertyChangeEvent event) {
                    switch (event.getPropertyName()) {
                        case "progress":
                            progressBar.setIndeterminate(false);
                            progressBar.setValue((Integer) event.getNewValue());
                            break;
                    }
                }
            });
            //then to get start you have to use execute()
            worker.execute();
            }

        });        
        panel.add(progressBar);
        panel.add(button);


    }


    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI("SwingWorker Example");
            }
        });
    }

    private static void createAndShowGUI(String str) {            
        JFrame frame = new JFrame(str);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.add(new GUI().panel);
        frame.pack();
        frame.setVisible(true);
    }  


    static class MySwingWorker extends SwingWorker<Void,Void>{
        @Override
        protected Void doInBackground() throws Exception{
            //here you make heavy task this is running in another thread not in EDT
           int i = 0;
           setProgress(i);
           // call query 1
           while(i < 50){
             setProgress(i++);
             Thread.sleep(5); // random magic number
           }
           // then call query 2
           while(i <= 100){
             setProgress(i++);
             Thread.sleep(5); // random magic number
           }

           return null;
        }
    }

}
公共类GUI{
私人JPanel小组;
私人JProgressBar progressBar;
私人按钮;
公共图形用户界面(){
panel=新的JPanel();
progressBar=新的JProgressBar();
按钮=新按钮(“按我”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
SwingWorker worker=新的MySwingWorker();
worker.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(最终属性更改事件){
开关(event.getPropertyName()){
案例“进展”:
progressBar.SetUndeterminate(假);
progressBar.setValue((整数)event.getNewValue());
打破
}
}
});
//然后要开始,必须使用execute()
worker.execute();
}
});        
面板。添加(进度条);
面板。添加(按钮);
}
公共静态void main(字符串[]args){
//为事件调度线程计划作业:
//创建并显示此应用程序的GUI。
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI(“SwingWorker示例”);
}
});
}
私有静态void createAndShowGUI(字符串str){
JFrame=新JFrame(str);
frame.setDefaultCloseOperation(关闭时退出);
frame.add(新GUI().panel);
frame.pack();
frame.setVisible(true);
}  
静态类MyWingWorker扩展了SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
//在这里,您需要执行繁重的任务,这是在另一个线程中运行的,而不是在EDT中
int i=0;
环境运输及工程署(一);
//呼叫查询1
而(i<50){
setProgress(i++);
Thread.sleep(5);//随机幻数
}
//然后调用查询2

虽然(我再次编辑了我的代码,你可以在下面签入。但是当我点击buton worker not executed and progressbar这次不来了。我怀疑progressbar没有被解雇。我错了吗?@Lacrymae这不是stackoverflow的工作方式,你应该编辑你的问题,这部分是为了答案而不是问题,删除你的答案并编辑你。)r问题!如果你不写一篇好的(可读的)文章,我不明白你的问题是什么问题。哦,好的,我明白了,我现在删除答案并编辑我的问题。编辑:好的,我删除了我的答案并编辑了上面的问题。你可以检查我项目的最后一个情况及其问题。@Lacrymae我不明白你的自定义进度条,它根本没有必要。你应该提供GUI类中的代码,我建议你使用
JProgressBar
直接!嗯,你们提供在主GUI中创建新的Jprogressbar,对吗?问题解决了:我将Swingworker类和ProgressBar类带到我的主GUI类中。所以我不再需要使用costructor,现在一切正常。问题是:当Swingworker类在主GUI类中创建时,我们必须使用构造函数。
public class GUI {

    private JPanel panel;
    private JProgressBar progressBar;
    private JButton button;

    public GUI(){
        panel = new JPanel();
        progressBar = new JProgressBar();
        button = new JButton("Press me");
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                SwingWorker worker = new MySwingWorker();
                worker.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(final PropertyChangeEvent event) {
                    switch (event.getPropertyName()) {
                        case "progress":
                            progressBar.setIndeterminate(false);
                            progressBar.setValue((Integer) event.getNewValue());
                            break;
                    }
                }
            });
            //then to get start you have to use execute()
            worker.execute();
            }

        });        
        panel.add(progressBar);
        panel.add(button);


    }


    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI("SwingWorker Example");
            }
        });
    }

    private static void createAndShowGUI(String str) {            
        JFrame frame = new JFrame(str);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.add(new GUI().panel);
        frame.pack();
        frame.setVisible(true);
    }  


    static class MySwingWorker extends SwingWorker<Void,Void>{
        @Override
        protected Void doInBackground() throws Exception{
            //here you make heavy task this is running in another thread not in EDT
           int i = 0;
           setProgress(i);
           // call query 1
           while(i < 50){
             setProgress(i++);
             Thread.sleep(5); // random magic number
           }
           // then call query 2
           while(i <= 100){
             setProgress(i++);
             Thread.sleep(5); // random magic number
           }

           return null;
        }
    }

}