Build a progress bar without launching a new Thread

后端 未结 2 1026
感动是毒
感动是毒 2021-01-29 11:01

I need to add a progress bar in a JFrame but I want to update this bar without generating a new Thread (for example SwingWorker that update bar in background).

2条回答
  •  暗喜
    暗喜 (楼主)
    2021-01-29 11:26

    You should use Modal Dialog for blocking:

    EDIT: progress visualization in EDT - that can also be done with your PropertyChangeEvent

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    
    public class Test {
    
        public Test() {
            createAndShowGUI();
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Test();
                }
            });
        }
    
        private void createAndShowGUI() {
            JFrame frame = new JFrame();
            frame.setSize( 500, 500 );
            frame.setLocationRelativeTo( null );
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout( new BorderLayout() );
            frame.getContentPane().add(new JButton( openChooseGUI() ), BorderLayout.SOUTH);      
            frame.setVisible(true);
        }
    
        private Action openChooseGUI() {
            return new AbstractAction("ChooseGUI") {
                @Override
                public void actionPerformed( ActionEvent e ) {
                    new ChooseGUI().setVisible( true );
                }
            };
        }
    
        public class ChooseGUI extends JFrame {
    
            public ChooseGUI() {
                setSize( 200, 200 );
                setLocationRelativeTo( null );
                setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
                getContentPane().setLayout( new BorderLayout() );
                getContentPane().add( new JLabel( "This is ChooseGUI" ), BorderLayout.CENTER );
                init();
            }
    
            private void init() {
                final JDialog progressDialog = new JDialog( this, true );
                final JProgressBar progress = new JProgressBar( JProgressBar.HORIZONTAL );
                progress.addChangeListener( new ChangeListener() {
                    @Override
                    public void stateChanged( ChangeEvent e ) {
                        // TODO Auto-generated method stub
                        int current = ((JProgressBar)e.getSource()).getValue();
                        if(current >= 100) {
                            progressDialog.dispose();
                        }
                    }
                } );
    
                progressDialog.setSize( 400, 100 );
                progressDialog.setLocationRelativeTo( this );
                progressDialog.getContentPane().setLayout( new BorderLayout() );
                progressDialog.getContentPane().add( progress, BorderLayout.NORTH );
                progressDialog.getContentPane().add(  new JLabel( "This is Progress Dialog" ), BorderLayout.CENTER );
                progressDialog.getContentPane().add(  new JButton(new AbstractAction("click to progress") {
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        progress.setValue( progress.getValue()+25 );
                    }
                }), BorderLayout.SOUTH );
                progressDialog.setVisible( true );
            }
    
        }
    
    }
    

提交回复
热议问题