Can a progress bar be used in a class outside main?

后端 未结 3 746
孤独总比滥情好
孤独总比滥情好 2020-11-21 06:47

Right now, my main just calls a gui with 10 rows. Based on how many of those rows have text, 1 of 9 classes is called (two rows must have text). The called class performs

3条回答
  •  后悔当初
    2020-11-21 07:16

    SwingWorker is ideal for this. The example below performs a simple iteration in the background, while reporting progress and intermediate results in a window. You can pass whatever parameters you need in a suitable SwingWorker constructor.

    import java.awt.EventQueue;
    import java.awt.GridLayout;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.text.DecimalFormat;
    import java.util.List;
    import javax.swing.*;
    
    /** @see http://stackoverflow.com/questions/4637215 */
    public class TwoRoot extends JFrame {
    
        private static final String s = "0.000000000000000";
        private JProgressBar progressBar = new JProgressBar(0, 100);
        private JLabel label = new JLabel(s, JLabel.CENTER);
    
        public TwoRoot() {
            this.setLayout(new GridLayout(0, 1));
            this.setTitle("√2");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.add(progressBar);
            this.add(label);
            this.setSize(161, 100);
            this.setLocationRelativeTo(null);
            this.setVisible(true);
        }
    
        public void runCalc() {
            progressBar.setIndeterminate(true);
            TwoWorker task = new TwoWorker();
            task.addPropertyChangeListener(new PropertyChangeListener() {
    
                @Override
                public void propertyChange(PropertyChangeEvent e) {
                    if ("progress".equals(e.getPropertyName())) {
                        progressBar.setIndeterminate(false);
                        progressBar.setValue((Integer) e.getNewValue());
                    }
                }
            });
            task.execute();
        }
    
        private class TwoWorker extends SwingWorker {
    
            private static final int N = 5;
            private final DecimalFormat df = new DecimalFormat(s);
            double x = 1;
    
            @Override
            protected Double doInBackground() throws Exception {
                for (int i = 1; i <= N; i++) {
                    x = x - (((x * x - 2) / (2 * x)));
                    setProgress(i * (100 / N));
                    publish(Double.valueOf(x));
                    Thread.sleep(1000); // simulate latency
                }
                return Double.valueOf(x);
            }
    
            @Override
            protected void process(List chunks) {
                for (double d : chunks) {
                    label.setText(df.format(d));
                }
            }
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TwoRoot t = new TwoRoot();
                    t.runCalc();
                }
            });
        }
    }
    

提交回复
热议问题