【问题标题】:Add Progress bar to Swing project [closed]将进度条添加到 Swing 项目 [关闭]
【发布时间】:2014-02-16 15:43:49
【问题描述】:

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

GUI类;

第二类:MySwingWorker

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 中有按钮操作;

private void GoButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
  // TODO add your handling code here:
  MySwingWorker task = new MySwingWorker(GUI.this);
  task.execute();   
} 

当程序启动时,GUI屏幕出现,用户选择两个日期并按下GO按钮。

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

只是我想要当在 GUI 上单击 GO 按钮时,进度监视器应该出现在屏幕上并显示工作人员状态。但我不知道如何为这个项目实施全新的进度监控框架并说听工人。

谢谢。

【问题讨论】:

  • 问题已解决:我将 Swingworker 类和进度条类带到我的主 GUI 类。所以我不再需要使用 costructor 了,现在一切正常。问题是:当从主 GUI 类创建 SwingWorker 类时,我们必须使用构造函数。

标签: java swing constructor progress-bar swingworker


【解决方案1】:

这与您之前的@​​987654321@ 类似。我推荐你使用 SwingWorker,你做得很好!

但是你不注意这个。我使用Property Change Listeners。在我在匿名类中使用的代码中。 当您将 swingWorker setProgress 作为 progress 调用时,它是一个绑定属性,然后当您使用 setProgress 更改该值时,它会通知所有它的听众!

我为你做了一个简单的例子。

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;
        }
    }

}

编辑

正如您在 cmets 中所说,您需要在另一个框架中显示,我建议您在对话框中显示,您可以使用 Progress Monitor 在这里您有一个完整的 example

【讨论】:

  • 我再次编辑我的代码,您可以在下面签入。但是,当我单击按钮时,工人未执行并且这次进度条没有出现。我怀疑进度条没有在任何地方触发。我错了吗?
  • @Lacrymae 这不是 stackoverflow 的工作方式,你应该编辑你的问题,这部分是为了回答而不是为了问题,删除你所做的答案并编辑你的问题!如果你没有提出一个好的(可读的)问题,我无法理解你的问题。
  • 哦,好的,我明白我删除答案并编辑我的问题现在只需一秒钟。编辑:好的,我删除了我的答案并编辑了我上面的问题。您可以查看我项目的最新情况及其问题。
  • @Lacrymae 我不明白你的自定义 ProgressBar 根本没有必要。你应该提供 GUI 类的代码我建议你直接使用JProgressBar
  • 嗯,你提供在主 GUI 中创建新的 Jprogressbar 对吗?
猜你喜欢
  • 2019-08-12
  • 2022-01-17
  • 2013-06-20
  • 2015-01-26
  • 2020-09-05
  • 1970-01-01
  • 2018-04-21
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多