我们如何同时运行多个Swing.timer?
我的应用程序是当我点击我的jframe按钮时它将执行两个swing计时器并同时运行,但看起来这个动作会让我的应用程序运行得很慢而且滞后。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//************first swing timer execution************************
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText("Hello Girls");
}
};
javax.swing.Timer timer = new javax.swing.Timer( 0 , taskPerformer);
timer.setRepeats(true);
timer.start(); // execute first swing timer
//************second swing timer execution************************
ActionListener taskPerformer1 = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jLabel1.setText("Hello Guys");
}
};
javax.swing.Timer timer1 = new javax.swing.Timer( 0 , taskPerformer1);
timer1.setRepeats(true);
timer1.start(); //execute second swing timer
}
我注意到如果我同时运行两个计时器,它将冻结我的应用程序。如何在没有冻结或延迟的情况下运行两个计时器?
答案 0 :(得分:3)
0
毫秒的延迟很可能会导致EDT发生Action
个事件(以及setText
调用产生的其他更新事件)。
您需要为EDT提供喘息的空间,不仅要处理您的Action
事件,还要处理这些事件的后果,例如
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TimerExample {
public static void main(String[] args) {
new TimerExample();
}
public TimerExample() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
private JLabel label;
private JButton button;
private Timer hisTimer;
private Timer herTimer;
public static final int DELAY = 1000;
public TestPane() {
setLayout(new BorderLayout());
label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
button = new JButton("Start");
hisTimer = new Timer(DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("His");
}
});
hisTimer.setInitialDelay(DELAY / 2);
hisTimer.setCoalesce(true);
herTimer = new Timer(DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
label.setText("Hers");
}
});
herTimer.setCoalesce(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (hisTimer.isRunning() && herTimer.isRunning()) {
hisTimer.stop();
herTimer.stop();
button.setText("Start");
} else {
hisTimer.start();
herTimer.start();
button.setText("Stop");
}
}
});
add(button, BorderLayout.SOUTH);
add(label);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}