JProgressBar with Timer |
package javatask; import java.awt.BorderLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Timer; import java.util.TimerTask; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JProgressBar; import static javax.swing.SwingConstants.HORIZONTAL; import javax.swing.SwingUtilities; /** * @web http://java-buddy.blogspot.com/ */ public class JavaTask extends JFrame implements ActionListener { Label labelInfo; JButton buttonRun; JProgressBar jProgressBar1; Timer timer; public static void main(String[] args) { SwingUtilities.invokeLater(() -> { createAndShowGUI(); }); } private static void createAndShowGUI() { JavaTask myTaskFrame = new JavaTask(); myTaskFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); myTaskFrame.prepareUI(); myTaskFrame.pack(); myTaskFrame.setVisible(true); } private void prepareUI() { JPanel vPanel = new JPanel(); vPanel.setLayout(new BoxLayout(vPanel, BoxLayout.Y_AXIS)); jProgressBar1 = new JProgressBar(HORIZONTAL, 0, 10); vPanel.add(jProgressBar1); labelInfo = new Label(); vPanel.add(labelInfo); buttonRun = new JButton("Run"); buttonRun.addActionListener(this); getContentPane().add(vPanel, BorderLayout.CENTER); getContentPane().add(buttonRun, BorderLayout.PAGE_END); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == buttonRun) { labelInfo.setText("Run button click"); if(timer != null){ timer.cancel(); } timer = new Timer(); TimerTask timeTask = new TimerTask() { private int progress = 0; private final int max_progress = 10; @Override public void run() { if(progress == max_progress){ timer.cancel(); labelInfo.setText("Finished"); }else{ progress++; labelInfo.setText("progress: " + getProgress()); jProgressBar1.setValue(getProgress()); } } int getProgress(){ return progress; } }; timer.schedule(timeTask, 1000, 1000); } } }
Remark: In this example, the ui elements are updated in TimerTask run on non-ui thread. If you want to update ui inside, you shoulad using javax.swing.Timer. Read next post: java.util.Timer and javax.swing.Timer.
~ thanks comment by Tomtom.
You should stay with the event-dispatching thread if you want to update Swing components. So you should use a javax.swing.Timer
ReplyDeleteThanks for your comment.
Delete