使用您已经拥有的 Timer 来帮助您确定 2 秒结束的时间,您可以通过在 Timer 内部计算调用 actionPerformed 方法的次数来做到这一点。当它被调用 4 次(2 秒)时,停止 Timer。很简单:
Timer blinkTimer = new Timer(500, new ActionListener() {
private int count = 0;
private int maxCount = 4;
private boolean on = false;
public void actionPerformed(ActionEvent e) {
if (count >= maxCount) {
button.setBackground(null);
((Timer) e.getSource()).stop();
} else {
button.setBackground( on ? Color.YELLOW : null);
on = !on;
count++;
}
}
});
blinkTimer.start();
您还告诉我,您希望在此闪烁期间以某种方式暂停某些程序的执行,为此我建议您创建一个方法,例如 enableExecution(boolean) 为您执行此操作,您调用在启动 Timer 之前并在 Timer 完成后再次调用,例如:
Timer blinkTimer = new Timer(500, new ActionListener() {
private int count = 0;
private int maxCount = 4;
private boolean on = false;
public void actionPerformed(ActionEvent e) {
if (count >= maxCount) {
button.setBackground(null);
((Timer) e.getSource()).stop();
enableExecution(true); // ***** re-enable execution of whatever *****
} else {
button.setBackground( on ? Color.YELLOW : null);
on = !on;
count++;
}
}
});
enableExecution(false); // ***** disable execution of whatever *****
blinkTimer.start();
编辑
关于您编辑的代码,我仍然认为最好的解决方案是再次调用从计时器中显示对话框的代码。如果您的问题是调用计时器的类没有在对话框中适当显示所需的信息,请考虑将此信息传递给该类。例如:
import java.awt.Color;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class BetterA extends JPanel {
private static final int TIMER_DELAY = 500;
private JButton button = new JButton("Hello");
// information needed by the dialog:
private String message;
private String title;
public BetterA(String message, String title) {
add(button);
blinking();
// set the dialog information
this.message = message;
this.title = title;
}
private void blinking() {
button.setOpaque(true);
Timer blinkTimer = new Timer(TIMER_DELAY, new ActionListener() {
private int count = 0;
private int maxTime = 2000;
private boolean on = false;
public void actionPerformed(ActionEvent e) {
if (count * TIMER_DELAY >= maxTime) {
button.setBackground(null);
((Timer) e.getSource()).stop();
Window win = SwingUtilities.getWindowAncestor(BetterA.this);
JOptionPane.showMessageDialog(win, message, title,
JOptionPane.PLAIN_MESSAGE);
} else {
button.setBackground(on ? Color.YELLOW : null);
on = !on;
count++;
}
}
});
blinkTimer.start();
}
private static void createAndShowGui() {
String myMessage = "Popup message";
String myTitle = "Some Title";
BetterA mainPanel = new BetterA(myMessage, myTitle);
JFrame frame = new JFrame("BetterA");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
编辑 2
另一种选择是使用 Swing 固有的 PropertyChangeListener 支持。例如:
import java.awt.Color;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
public class BetterA2 extends JPanel {
private static final int TIMER_DELAY = 500;
private static final int MAX_TIME = 2000;
private static final String READY = "ready";
private JButton button = new JButton("Hello");
public BetterA2() {
add(button);
blinking();
}
private void blinking() {
button.setOpaque(true);
Timer blinkTimer = new Timer(TIMER_DELAY, new ActionListener() {
private int count = 0;
private boolean on = false;
public void actionPerformed(ActionEvent e) {
if (count * TIMER_DELAY >= MAX_TIME) {
button.setBackground(null);
((Timer) e.getSource()).stop();
// !!!
firePropertyChange(READY, READY, null);
} else {
button.setBackground(on ? Color.YELLOW : null);
on = !on;
count++;
}
}
});
blinkTimer.start();
}
private static void createAndShowGui() {
final BetterA2 mainPanel = new BetterA2();
mainPanel.addPropertyChangeListener(BetterA2.READY,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
JOptionPane.showMessageDialog(mainPanel, "Popup message",
"Title", JOptionPane.PLAIN_MESSAGE);
}
});
JFrame frame = new JFrame("BetterA");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}