从 SwingWorker 更新 JProgressBar [英] Update JProgressBar from a SwingWorker

查看:43
本文介绍了从 SwingWorker 更新 JProgressBar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 Java 新手,正在尝试构建一个从 JSwing TextFields 接收 6 个输入的应用程序.我有大约 5 个复选框.根据选择,从数据库中获取一些详细信息.所有其他事情现在都在工作,但我想放置一个进度条,根据进度更新值.我尝试跨复选框手动将 ProgressBars 更新为 progressBar.setValue(0) 到 progressBar.setValue(100) .但它没有得到更新.在浏览了一些在线文章后,我发现使用此链接中的 Swing worker.我试过罗宾的解决方案.如何使我的 SwingWorker 示例正常工作? .它创建了一个单独的对话框,但它是空的.

I am new to Java and trying to build an application that receives 6 inputs from JSwing TextFields. I have around 5 checkboxes. Based on the selection, some of the details are fetched from database. All other things are working now, but I want to place a progress bar that updates the value based on the progress. I tried manually updating the ProgressBars with progressBar.setValue(0) to progressBar.setValue(100) across checkboxes. But it did not get updated. After going through some of the articles online, I found using swing worker from this link. I tried Robin's solution. How do I make my SwingWorker example work properly? . It creates a separate dialog but, it is empty.

像这样显示进度

有没有办法在我的程序中设置进度条更新?

Is there a way I can set progress bar updating in my program?

        jButton1 = new javax.swing.JButton();
        jButton1.addActionListener(new ActionListener() {
            @Override
            
            public void actionPerformed(ActionEvent e) {
            
                    progressBar.setValue(0);


                 if(Sizing_details.isSelected()) {
                        
                         progressBar.setValue(20); 
                        
                         
                    }

然后我尝试使用我提到的链接中的 Swing worker.

Then I tried using swing worker from the link I mentioned.

                    public void actionPerformed(ActionEvent e) {
            
                    new GuiWorker().execute();

对话框被敲击,什么也没有显示.但功能明智它的工作原理.你能帮我解决这个问题吗.

The dialog is struck and nothing shows up. But Functionality wise it works. Could you please help me how I can fix it.

我有两个问题.

  1. 每当我在提交按钮操作下的复选框中设置它们时,是否可以手动更新 ProgressBar.?
  2. 如果我必须使用 Swing Worker,是否可以在同一帧中添加进度条并对其进行操作.

编辑我:

我可以让进度条弹出.但是,当我调用go"时方法来自以下链接SwingWorker ProgressBar

I can make the Progress bar pop up. However, When I call the "go" method from the link below SwingWorker ProgressBar

在我的 Jbutton 操作事件中,它显示一个空白屏幕.

inside my Jbutton action event , it shows a blank screen.

但是当我在 run 方法中调用相同的方法时,它工作正常.

But when I call the same method inside run method it works fine.

            java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() { go();
                try {
                    new JFrame_Demo().setVisible(true);
                    jButton1.addActionListener(new ActionListener() {
                        
                        public void actionPerformed(ActionEvent e) {
                            
                            
                        
                                

以上代码有效.它初始化一个进度条.

The above code works. it initialises a progress bar.

              java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() { 
                try {
                    new JFrame_Demo().setVisible(true);
                    jButton1.addActionListener(new ActionListener() {
                        
                        public void actionPerformed(ActionEvent e) {
                            
                            go();
                        
                                

上面的代码显示一个空白的白屏.

the above code shows a blank white screen.

    import java.awt.Color;
import java.awt.Dialog;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import javax.swing.AbstractAction;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.ibm.java.diagnostics.utils.plugins.Container;
import com.ibm.jvm.trace.format.api.Component;
import com.sun.tools.javac.util.List;

import javax.swing.JToolBar;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JCheckBox;
import dbutility.*;

    public class JFrame_Demo extends javax.swing.JFrame {
        
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        /**
         * Creates new form JFrame_Demo
         * @throws IOException 
         * @throws FontFormatException 
         * @throws InterruptedException 
         */
        
        public JFrame_Demo() throws FontFormatException, IOException, InterruptedException {
            
            
            setTitle("Database Statistics Execution");
            initComponents();
            getContentPane().setBackground(Color.WHITE);
            setBackground(Color.white);
            setResizable(false);
            setSize(800,800);
            
           pack();
            setVisible(true);
         
        }
        
        
        
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         * @throws IOException 
         * @throws FontFormatException 
         * @throws InterruptedException 
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
        private void initComponents() throws FontFormatException, IOException, InterruptedException {
            Font customFont = Font.createFont(Font.TRUETYPE_FONT, new File("lib\\Font\\3ds_Regular.otf")).deriveFont(12f);
         
            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            ge.registerFont(customFont);
            
            DBUser_Input = new javax.swing.JLabel();
           
            DBUser_Input.setFont(customFont);
            
            DBUser_Input.setToolTipText("Database System User");
            Schema = new javax.swing.JTextField();
            space_user_lable = new javax.swing.JLabel();
            space_user_lable.setFont(customFont);
            jLabel4 = new javax.swing.JLabel();
            jLabel4.setFont(customFont);
            jLabel5 = new javax.swing.JLabel();
            jLabel5.setFont(customFont);
            Username = new javax.swing.JTextField();
            Instance = new javax.swing.JTextField();
            syspassword = new javax.swing.JPasswordField();
            schema_password = new javax.swing.JPasswordField();
            jButton1 = new javax.swing.JButton();
            JProgressBar pb = new JProgressBar();
            getContentPane().add(pb);
            jButton1.addActionListener(new ActionListener() {
                @Override
                
                
                public void actionPerformed(ActionEvent e ) {
                    new GuiWorker().execute();
                
                    String schema = Schema.getText();
                    String Schema_Password = schema_password.getText();
                    String port = Port.getText();
                    String instance = Instance.getText();
                    String Host = host.getText();
                    String URL = "jdbc:oracle:thin:@"+Host+":"+port+":"+instance;
                    String dbpassword = syspassword.getText();
                    String username = Username.getText();
                    
                    
                    try {
                        Class.forName("oracle.jdbc.OracleDriver");
                        Connection con = DriverManager.getConnection(URL,username,dbpassword);
                    if(Exp_Schema_Check.isSelected()) {
                            // PROGRESS BAR TO BE SET TO 20
                            //Execute 20 database queries....
                            
                            
                    }
                        if(DB_Parameters_Sizing_Details.isSelected()) {
                            // PROGRESS BAR TO BE SET TO 50
                             //Execute 12 Database queries
                            
                             
                        }
                        
                        
                    if(Redo_Log.isSelected()) {
                        PROGRESS BAR TO BE SET TO 75
                        //... Execute 35 queries. . 

                    }
                        } catch (ClassNotFoundException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        } catch (SQLException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                     
                    System.exit(0);
                        
                        
                    }
                
                
                }
            
                    );
            
                 
            Exp_Schema_Check = new javax.swing.JCheckBox();
            DB_Parameters_Sizing_Details = new javax.swing.JCheckBox();
            DB_Parameters_Sizing_Details.setFont(customFont);
            Redo_Archive_Details = new javax.swing.JCheckBox();
            Redo_Archive_Details.setFont(customFont);
            Session_Details = new javax.swing.JCheckBox();
            Session_Details.setFont(customFont);
            Tablespaces_Details = new javax.swing.JCheckBox();
            Tablespaces_Details.setFont(customFont);
            SPM_Performance_Details = new javax.swing.JCheckBox();
            SPM_Performance_Details.setFont(customFont);
            
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            DBUser_Input.setText("Enter Database System Username");

            Schema.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jTextField1ActionPerformed(evt);
                }
            });
            
            space_user_lable.setText("Enter 3DSpace Username");

            jLabel4.setText("Enter Instance Name");

            jLabel5.setText("Enter 3DSpace Password");

            Username.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jTextField2ActionPerformed(evt);
                }
            });

            Instance.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jTextField4ActionPerformed(evt);
                }
            });
            
                        
            jButton1.setText("Submit");

            Exp_Schema_Check.setText("Exp_Schema_Check");
            Exp_Schema_Check.setFont(customFont);

            DB_Parameters_Sizing_Details.setText("DB_Parameters_Sizing_Details");

            Redo_Archive_Details.setText("Redo_Archive_Details");

            Session_Details.setText("Session_Details");

            Tablespaces_Details.setText("Tablespaces_Details");

            SPM_Performance_Details.setText("SPM_Performance_Details");
            
            JLabel Hostname = new JLabel();
            Hostname.setFont(customFont);
            Hostname.setText("Enter the Database Hostname");
            
            host = new JTextField();
            
            JLabel lblEnterTheDatabase = new JLabel();
            lblEnterTheDatabase.setFont(customFont);
            lblEnterTheDatabase.setText("Enter the Database Port");
            
            Port = new JTextField();
            
            JLabel syspass_label = new JLabel();
            syspass_label.setFont(customFont);
            syspass_label.setText("Enter Database System Password");
            
            JLabel lblPoweredByDs = new JLabel();
            lblPoweredByDs.setForeground(new Color(51, 102, 204));
            lblPoweredByDs.setToolTipText("Database System User");
            lblPoweredByDs.setFont(customFont);
            lblPoweredByDs.setFont(customFont);
            
            lblPoweredByDsgs = new JLabel();
            lblPoweredByDsgs.setForeground(new Color(0, 153, 255));
            lblPoweredByDsgs.setText("Powered By DSGS Infra Team");
            lblPoweredByDsgs.setFont(null);
            
            selectall = new JCheckBox("Select All");
           
           
            selectall.addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(ItemEvent arg0) {

                    if(selectall.isSelected()) {
                        Exp_Schema_Check.setSelected(true);
                        DB_Parameters_Sizing_Details.setSelected(true);
                        Redo_Archive_Details.setSelected(true);
                        Session_Details.setSelected(true);
                        SPM_Performance_Details.setSelected(true);
                        Tablespaces_Details.setSelected(true);
                        
                    }
                    
                    else if(selectall.isSelected()==false) {
                        Exp_Schema_Check.setSelected(false);
                        DB_Parameters_Sizing_Details.setSelected(false);
                        Redo_Archive_Details.setSelected(false);
                        Session_Details.setSelected(false);
                        SPM_Performance_Details.setSelected(false);
                        Tablespaces_Details.setSelected(false);
                        
                    }
                        
                    
                }
                
            });
            
            progressBar = new JProgressBar();
            progressBar.setStringPainted(true);
            
            
            
                

                
            
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            layout.setHorizontalGroup(
                layout.createParallelGroup(Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                    .addComponent(jLabel4)
                                    .addComponent(space_user_lable)
                                    .addComponent(Hostname)
                                    .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                        .addGroup(layout.createSequentialGroup()
                                            .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                                .addComponent(DBUser_Input)
                                                .addComponent(jLabel5))
                                            .addGap(105)
                                            .addGroup(layout.createParallelGroup(Alignment.TRAILING, false)
                                                .addComponent(Username, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 197, Short.MAX_VALUE)
                                                .addComponent(Schema, GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)
                                                .addComponent(schema_password, Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                                                .addComponent(Instance, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)
                                                .addComponent(host, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)
                                                .addComponent(syspassword, Alignment.LEADING)
                                                .addComponent(Port, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 172, Short.MAX_VALUE)))
                                        .addComponent(lblPoweredByDs, Alignment.TRAILING, GroupLayout.PREFERRED_SIZE, 149, GroupLayout.PREFERRED_SIZE)))
                                .addContainerGap(1427, Short.MAX_VALUE))
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(syspass_label, GroupLayout.DEFAULT_SIZE, 1312, Short.MAX_VALUE)
                                .addGap(612))))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(30)
                        .addGroup(layout.createParallelGroup(Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(selectall)
                                .addGap(381)
                                .addComponent(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                            .addComponent(Exp_Schema_Check)
                            .addComponent(DB_Parameters_Sizing_Details)
                            .addComponent(Redo_Archive_Details)
                            .addComponent(Session_Details)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                    .addComponent(SPM_Performance_Details)
                                    .addComponent(Tablespaces_Details))
                                .addGroup(layout.createParallelGroup(Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addGap(182)
                                        .addComponent(jButton1))
                                    .addGroup(layout.createSequentialGroup()
                                        .addGap(381)
                                        .addComponent(lblPoweredByDsgs, GroupLayout.PREFERRED_SIZE, 185, GroupLayout.PREFERRED_SIZE)))))
                        .addContainerGap(1161, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(lblEnterTheDatabase, GroupLayout.PREFERRED_SIZE, 170, GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(1754, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(DBUser_Input)
                            .addComponent(Username, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(48)
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(syspass_label, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE)
                            .addComponent(syspassword, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(58)
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(space_user_lable)
                            .addComponent(Schema, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(45)
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(jLabel5)
                            .addComponent(schema_password, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(44)
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(jLabel4)
                            .addComponent(Instance, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(44)
                        .addGroup(layout.createParallelGroup(Alignment.BASELINE)
                            .addComponent(Hostname)
                            .addComponent(host, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addGap(18)
                        .addGroup(layout.createParallelGroup(Alignment.LEADING)
                            .addComponent(lblEnterTheDatabase)
                            .addComponent(Port, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(ComponentPlacement.RELATED, 75, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(Alignment.TRAILING)
                            .addComponent(progressBar, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                            .addComponent(selectall))
                        .addGap(18)
                        .addGroup(layout.createParallelGroup(Alignment.LEADING)
                            .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(Exp_Schema_Check)
                                .addGap(18)
                                .addComponent(DB_Parameters_Sizing_Details)
                                .addGap(18)
                                .addComponent(Redo_Archive_Details)
                                .addGap(18)
                                .addComponent(Session_Details)
                                .addGap(18)
                                .addComponent(SPM_Performance_Details)
                                .addGap(18)
                                .addComponent(Tablespaces_Details))
                            .addGroup(Alignment.TRAILING, layout.createSequentialGroup()
                                .addComponent(jButton1)
                                .addPreferredGap(ComponentPlacement.RELATED)
                                .addComponent(lblPoweredByDsgs)))
                        .addGap(49)
                        .addComponent(lblPoweredByDs, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
            );
            getContentPane().setLayout(layout);
            

            pack();
            
            
        }// </editor-fold>//GEN-END:initComponents
        
    
        private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField1ActionPerformed
            // TODO add your handling code here:
            
        }//GEN-LAST:event_jTextField1ActionPerformed

        private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField2ActionPerformed
            // TODO add your handling code here:
        }//GEN-LAST:event_jTextField2ActionPerformed

        private void jTextField4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField4ActionPerformed
            // TODO add your handling code here:
        }//GEN-LAST:event_jTextField4ActionPerformed

        /**
         * @param args the command line arguments
         * @return 
         * @return 
         * @throws InterruptedException 
         */
        
        
        public static void main(String args[]) {
             
            
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(JFrame_Demo.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            //</editor-fold>

            /* Create and display the form */
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        
                        
                        new JFrame_Demo().setVisible(true);
                        
                    } catch (FontFormatException | IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    
                }
            });
        }
        

                       
            
         

        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JButton jButton1;
        private javax.swing.JCheckBox Exp_Schema_Check;
        private javax.swing.JCheckBox DB_Parameters_Sizing_Details;
        private javax.swing.JCheckBox Redo_Archive_Details;
        private javax.swing.JCheckBox Session_Details;
        private javax.swing.JCheckBox Tablespaces_Details;
        private javax.swing.JCheckBox SPM_Performance_Details;
        private javax.swing.JLabel DBUser_Input;
        private javax.swing.JLabel dbpassword1;
        private javax.swing.JLabel space_user_lable;
        private javax.swing.JLabel jLabel4;
        private javax.swing.JLabel jLabel5;
        private javax.swing.JPasswordField syspassword;
        private javax.swing.JPasswordField schema_password;
        private javax.swing.JTextField Schema;
        private javax.swing.JTextField Username;
        private javax.swing.JTextField Instance;
        private JTextField host;
        private JTextField Port;
        HSSFWorkbook workbook = new HSSFWorkbook();
        private JLabel lblPoweredByDsgs;
        private JCheckBox selectall;
        private JProgressBar progressBar;
    }
    

非常感谢.

推荐答案

SwingWorker 用于运行长任务.这不是这里的情况,所以你不需要.
以下是您要实现的mre (1):

SwingWorker is used for running long tasks. This is not the case here so you do not need one.
The following is mre (1) of what you are trying to achieve:

import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

public class SwingMain {

    SwingMain() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(new TestPanel());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SwingMain();
    }
}

class TestPanel extends JPanel {

    private final List<JCheckBox> checkBoxes;

    public TestPanel() {

        checkBoxes = new ArrayList<>();
        for (int i=0; i<5; i++){
            JCheckBox cb = new JCheckBox();
            checkBoxes.add(cb);
            add(cb);
        }

        JProgressBar pb = new JProgressBar();
        add(pb);

        JButton btn = new JButton("Check");
        btn.addActionListener(evt ->  pb.setValue(countCheckedBoxes()* 100/checkBoxes.size()));
        add(btn);
    }

    private int countCheckedBoxes() {

        int counter = 0;
        for(JCheckBox cb : checkBoxes){
            if(cb.isSelected()) {
                counter++;
            }
        }
        return counter;
    }

    /* a more concise version using stream: 
    private int countCheckedBoxes() {
        return (int) checkBoxes.stream().filter(cb->cb.isSelected()).count();
    }
    */
}
 

如果你需要更新一个长进程的进度,使用 SwingWorker:

If you need to update progress of a long process use SwingWorker:

import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

public class SwingMain {

    SwingMain() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(new TestPanel());
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SwingMain();
    }
}

class TestPanel extends JPanel {

    private final JProgressBar pb;
    private final JButton btn;

    public TestPanel() {

        pb = new JProgressBar();
        add(pb);

        btn = new JButton("Run long process");
        btn.addActionListener(evt ->  new ProgressUpdateTask().execute());
        add(btn);
    }

    class ProgressUpdateTask extends SwingWorker<Void, Integer> {


        @Override
        protected void process(List<Integer> chunks) {
            int i = chunks.get(chunks.size()-1);
            pb.setValue(i); // The last value in this array is all we care about.
        }

        @Override
        protected Void doInBackground() throws Exception {
            btn.setEnabled(false);
            for(int i = 0; i < 100; i++) {
                Thread.sleep(50); //simulate long process
                publish(i);
            }
            btn.setEnabled(true);
            return null;
        }
    }
}

这篇关于从 SwingWorker 更新 JProgressBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆