~ source: http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html
Last post show "JProgressBar and java.util.Timer/java.util.TimerTask run on non-ui thread". In this post, I will apply java.util.Timer (the top group), invoke code later in ui thread from non-ui thread (the middle group) and javax.swing.Timer (the bottom group).
![]() |
| java.util.Timer and javax.swing.Timer |
package javatask;
import java.awt.BorderLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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 javax.swing.JSeparator;
import javax.swing.SwingConstants;
import static javax.swing.SwingConstants.HORIZONTAL;
import javax.swing.SwingUtilities;
/**
* @web http://java-buddy.blogspot.com/
*/
public class JavaTask extends JFrame
implements ActionListener {
Label labelInfo1, labelInfo2, labelInfo3;
Label labelThread1, labelThread2, labelThread3;
JProgressBar jProgressBar1, jProgressBar2, jProgressBar3;
JButton buttonRun;
java.util.Timer java_util_Timer;
javax.swing.Timer javax_swing_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));
Label labelThreadMain = new Label("UI Thread: " + Thread.currentThread());
vPanel.add(labelThreadMain);
vPanel.add(new JSeparator(SwingConstants.HORIZONTAL));
Label labelHeader1 = new Label("java.util.Timer");
vPanel.add(labelHeader1);
jProgressBar1 = new JProgressBar(HORIZONTAL, 0, 10);
vPanel.add(jProgressBar1);
labelInfo1 = new Label();
vPanel.add(labelInfo1);
labelThread1 = new Label();
vPanel.add(labelThread1);
vPanel.add(new JSeparator(SwingConstants.HORIZONTAL));
Label labelHeader2 = new Label("java.util.Timer -> invokeLater");
vPanel.add(labelHeader2);
jProgressBar2 = new JProgressBar(HORIZONTAL, 0, 10);
vPanel.add(jProgressBar2);
labelInfo2 = new Label();
vPanel.add(labelInfo2);
labelThread2 = new Label();
vPanel.add(labelThread2);
vPanel.add(new JSeparator(SwingConstants.HORIZONTAL));
Label labelHeader3 = new Label("javax.swing.Timer");
vPanel.add(labelHeader3);
jProgressBar3 = new JProgressBar(HORIZONTAL, 0, 10);
vPanel.add(jProgressBar3);
labelInfo3 = new Label();
vPanel.add(labelInfo3);
labelThread3 = new Label();
vPanel.add(labelThread3);
vPanel.add(new JSeparator(SwingConstants.HORIZONTAL));
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) {
if (java_util_Timer != null) {
java_util_Timer.cancel();
}
if (javax_swing_Timer != null) {
javax_swing_Timer.stop();
}
//use java.util.Timer() run in non-ui thread
java_util_Timer = new java.util.Timer();
TimerTask timeTask1 = new TimerTask() {
private int progress = 0;
private final int max_progress = 10;
@Override
public void run() {
if (progress == max_progress) {
java_util_Timer.cancel();
labelInfo1.setText("Finished");
SwingUtilities.invokeLater(() -> {
//run in ui thread
labelInfo2.setText("Finished");
labelThread2.setText(Thread.currentThread().toString());
});
} else {
progress++;
labelInfo1.setText("progress: " + getProgress());
jProgressBar1.setValue(getProgress());
SwingUtilities.invokeLater(() -> {
//run in ui thread
labelInfo2.setText("progress: " + getProgress());
jProgressBar2.setValue(getProgress());
labelThread2.setText(Thread.currentThread().toString());
});
}
labelThread1.setText(Thread.currentThread().toString());
}
int getProgress() {
return progress;
}
};
java_util_Timer.schedule(timeTask1, 1000, 1000);
//javax.swing.Timer run in ui thread
javax_swing_Timer = new javax.swing.Timer(1000,
new ActionListener() {
private int progress = 0;
private final int max_progress = 10;
@Override
public void actionPerformed(ActionEvent e) {
if (progress == max_progress) {
javax_swing_Timer.stop();
labelInfo3.setText("Finished");
} else {
progress++;
labelInfo3.setText("progress: " + progress);
jProgressBar3.setValue(progress);
}
labelThread3.setText(Thread.currentThread().toString());
}
});
javax_swing_Timer.setInitialDelay(1000);
javax_swing_Timer.start();
}
}
}

No comments:
Post a Comment