Erstellen Sie eine einfache message-box, die verschwindet nach ein paar Sekunden in Java
Ich Frage mich, was ist der beste Ansatz, um ein JOptionPane Stil plain message-box verschwinden, nachdem angezeigt wird für eine festgelegte Anzahl von Sekunden.
Bin ich denken, um Feuer auf einem separaten thread (mit einem timer) aus dem Haupt-GUI-thread um dies zu tun, so dass die GUI tragen kann, auf die Verarbeitung anderer Ereignisse etc. Aber wie kann ich eigentlich die message-box in diesem separaten thread verschwinden und beenden Sie den thread richtig. Danke.
Edit: also das ist, was ich kommen mit, indem Sie die folgenden Lösungen, die unten gebucht
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();
}
}
Nun die Frage ist, dass, wie ich cam-erstellen Sie mehrere Instanzen dieser Klasse werden im Verlauf der Interaktion zwischen dem Benutzer und der Haupt-Benutzeroberfläche, Frage ich mich, ob die dispose () - Methode löscht alles richtig jeder Zeit. Sonst kann ich am Ende mit anwachsender viele redundante Objekte im Speicher. danke.
Was macht Ihr profiler sagen?
... Methode finalize
könnten Sie das bitte näher erläutern?
trashgod (etwas verschlüsselt) Was macht Ihr profiler sagen? ... über die Methode finalize (oder detaillierter beschrieben in der API)
InformationsquelleAutor skyork | 2011-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, in Ihrer situation, Sie können nicht alle von
JOptionPane
statische Methoden (showX...
). Sie haben, um eineJOptionPane
Instanz statt, dann erstellen Sie eineJDialog
aus und zeigen, dassJDialog
selbst. Sobald SieJDialog
können Sie erzwingen, dass seine Sichtbarkeit.Ich habe es nicht ausprobiert, also kann ich nicht garantieren, dass es funktioniert, aber ich denke, es sollte 😉
Natürlich, hier
Timer
istjavax.swing.Timer
, wie schon jemand anderes erwähnt, so sind Sie sicher, dass die Aktion ausgeführt wird, die in der EDT, und Sie werden keine Probleme haben, die mit der Erstellung oder Beendigung Ihrer eigenenThread
.+1 gleiche Lösung, die ich kam mit.
+1 nicht schlechte Lösung.
um diese Lösung zu ermöglichen, die Sie für die Interaktion zu nennen
dialog.setModal(false);
vor dem Aufruf von setVisible-Methode(), die den dialog erstellt mit JOptionPane eingestellt ist modal standardmäßig.InformationsquelleAutor jfpoilpret
Timer haben Ihre eigenen threads. Ich denke, was Sie wahrscheinlich tun sollten ist, erstellen Sie eine neue
Timer
(oder, vorzugsweise, machen eine, die Sie wiederverwenden, bis Sie nicht mehr benötigen), eine Aufgabe planen, wird die Frage nach der message-box zu verschwinden und dann haben die Aufgabe fügen Sie eine weitere Aufgabe, um die Ereignis-queue, die entfernen Sie das Meldungsfeld.Gibt es vielleicht einen besseren Weg obwohl.
Zusätzlich:
Ja, mit
javax.swing.timer
wäre wahrscheinlich besser. Der Grund, warum ich sprechen über die Verwendung von zwei Aufgaben in der oben ist, ich nehme an, Sie haben für die Ausführung Ihrer Versteck-Methode innerhalb der AWT-thread zu vermeiden, bestimmte subtile Rennen Probleme, die möglicherweise auftreten. Wenn Siejavax.swing.Timer
du bist bereits ausgeführt im AWT-thread, also diesem Punkt gegenstandslos.javax.swing.Timer
, richtig?warum müssen Sie zwei Aufgaben hier? Was meinst du, mit einem anderen task 'entfernen Sie die message box"?
InformationsquelleAutor wds