创建一个简单的消息框,在Java中几秒后消失

时间:2011-05-11 14:35:28

标签: java swing

我想知道在显示设定的秒数后,使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()方法是否每次都能正确清理所有内容。否则,我最终可能会在内存中累积大量冗余对象。感谢。

2 个答案:

答案 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);

我没有尝试过,所以我不能保证它有效,但我认为它应该; - )

当然,这里Timerjavax.swing.Timer,正如其他人已经提到的那样,因此您确定该操作将在EDT中运行,您在创建或终止您的操作时不会遇到任何问题拥有Thread

答案 1 :(得分:1)

Timers有自己的主题。我认为您可能应该做的是创建一个新的Timer(或者,最好是重新使用,直到您不再需要它为止),安排一个任务,要求消息框消失,然后拥有该任务add another task to the event queue,这将删除消息框。

可能有更好的方法。

另外: 是的,使用javax.swing.timer可能会更好。我在上面讨论使用两个任务的原因是我假设你必须在AWT线程内执行你的隐藏方法,以避免可能出现的某些微妙的竞争问题。如果你使用javax.swing.Timer,你已经在AWT线程中执行了,那么这一点就没有用了。