Создайте простое окно сообщения, которое исчезает через несколько секунд в Java - PullRequest
4 голосов
/ 11 мая 2011

Интересно, каков лучший способ сделать так, чтобы обычное окно сообщений в стиле 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();
}
}

Теперь вопрос в том, что, поскольку я собираюсь создать несколько экземпляров этого классана протяжении всего процесса взаимодействия между пользователем и основным графическим интерфейсом, мне интересно, очищает ли метод каждый раз все правильно.В противном случае я могу накопить много избыточных объектов в памяти.спасибо.

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Я думаю, что в вашей ситуации вы не можете использовать любой из 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 голос
/ 11 мая 2011

Таймеры имеют свои темы.Я думаю, что вы, вероятно, должны сделать, это создать новый Timer (или, желательно, сделать тот, который вы используете повторно, пока он вам больше не нужен), запланировать задачу, которая будет запрашивать исчезновение окна сообщения, а затем иметьэта задача добавляет еще одну задачу в очередь событий , которая удалит окно сообщения.

Хотя может быть и лучший способ.

Кроме того: Да, используя javax.swing.timer, вероятно, будет лучше.Причина, по которой я говорю об использовании двух задач в приведенном выше, заключается в том, что я предполагаю, что вам придется выполнить свой метод скрытия внутри потока AWT, чтобы избежать некоторых тонких проблем гонки, которые могут возникнуть.Если вы используете javax.swing.Timer вы уже выполняется в AWT потоке, так что точка становится спорным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...