我想知道在显示设定的秒数后,使JOptionPane样式普通消息框消失的最佳方法是什么。
我正在考虑从主GUI线程启动一个单独的线程(使用一个计时器)来执行此操作,以便主GUI可以继续处理其他事件等。但是我如何实际制作消息框这个单独的线程消失并正确终止线程。感谢。
编辑:所以我按照下面发布的解决方案提出了这个问题
package util;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.Timer;
public class DisappearingMessage implements ActionListener
{
private final int ONE_SECOND = 1000;
private Timer timer;
private JFrame frame;
private JLabel msgLabel;
public DisappearingMessage (String str, int seconds)
{
frame = new JFrame ("Test Message");
msgLabel = new JLabel (str, SwingConstants.CENTER);
msgLabel.setPreferredSize(new Dimension(600, 400));
timer = new Timer (this.ONE_SECOND * seconds, this);
// only need to fire up once to make the message box disappear
timer.setRepeats(false);
}
/**
* Start the timer
*/
public void start ()
{
// make the message box appear and start the timer
frame.getContentPane().add(msgLabel, BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
timer.start();
}
/**
* Handling the event fired by the timer
*/
public void actionPerformed (ActionEvent event)
{
// stop the timer and kill the message box
timer.stop();
frame.dispose();
}
public static void main (String[] args)
{
DisappearingMessage dm = new DisappearingMessage("Test", 5);
dm.start();
}
}
现在的问题是,当我想在用户和主GUI之间的交互过程中创建这个类的多个实例时,我想知道dispose()方法是否每次都能正确清理所有内容。否则,我最终可能会在内存中累积大量冗余对象。感谢。
答案 0 :(得分:3)
我认为在您的情况下,您不能使用任何JOptionPane
静态方法(showX...
)。您必须改为创建JOptionPane
实例,然后从中创建JDialog
并自己显示JDialog
。获得JDialog
后,您可以强制其可见性。
// Replace JOptionPane.showXxxx(args) with new JOptionPane(args)
JOptionPane pane = new JOptionPane(...);
final JDialog dialog = pane.createDialog("title");
Timer timer = new Timer(DELAY, new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
// or maybe you'll need dialog.dispose() instead?
}
});
timer.setRepeats(false);
timer.start();
dialog.setVisible(true);
我没有尝试过,所以我不能保证它有效,但我认为它应该; - )
当然,这里Timer
是javax.swing.Timer
,正如其他人已经提到的那样,因此您确定该操作将在EDT中运行,您在创建或终止您的操作时不会遇到任何问题拥有Thread
。
答案 1 :(得分:1)
Timers有自己的主题。我认为您可能应该做的是创建一个新的Timer
(或者,最好是重新使用,直到您不再需要它为止),安排一个任务,要求消息框消失,然后拥有该任务add another task to the event queue,这将删除消息框。
可能有更好的方法。
另外:
是的,使用javax.swing.timer
可能会更好。我在上面讨论使用两个任务的原因是我假设你必须在AWT线程内执行你的隐藏方法,以避免可能出现的某些微妙的竞争问题。如果你使用javax.swing.Timer
,你已经在AWT线程中执行了,那么这一点就没有用了。