2016-11-15 1 views
0

Okay, dieses Problem hat mich in den letzten Tagen geplagt. Und bevor irgendjemand dazu kommentiert, ja, ich habe den Jframe sichtbar gemacht und ich habe alle Komponenten hinzugefügt, die ich dazu brauche. Außerdem werden alle Komponenten hinzugefügt, bevor die GUI auf visible gesetzt und activate() aufgerufen wird. Ich versuche, ein paar simeple Codezeilen laufenJFrame wird leer angezeigt, führt eine Schleife aus und zeigt dann Komponenten an

So .:

 g.setVisible(true); 
     g.activate(); 

Einfach genug. g ist ein Objekt, das aus einer Klasse erstellt wurde, die eine GUI erzeugt, die JFrame erweitert. und activate() ist eine Methode, die eine Endlosschleife ausführt, die nur eine Reihe von Dingen ausführt, bis der Benutzer sie zum Beenden auffordert. Wenn das Programm jedoch die g.setVisible() - Zeile erreicht, öffnet es einen JFrame, der die angegebene Größe hat, ist jedoch völlig frei von allem. Dann bewegt es sich auf die g.activate(); welches im Moment für eine bestimmte Anzahl von Iterationen und Stopps läuft. An diesem Punkt entscheidet es schließlich, dass es zurückgehen und meine GUI anzeigen kann. Das Problem dabei ist, dass die GUI durch die Schleife von active() aktualisiert werden soll und den Benutzer darüber informiert, was vor sich geht.

Jede Hilfe ist willkommen lassen Sie mich wissen, wenn Sie weitere Details benötigen und im Voraus zu danken.

+0

können Sie uns den Code der aktiven() Methode geben. für weitere Informationen – msagala25

+1

Für eine bessere Hilfe schreiben Sie bitte ein [mcve], sonst könnte Ihre Frage geschlossen werden, weil es fehlt; Ich mag nicht, wie '" ... das läuft eine Endlosschleife "' klingt, wahrscheinlich möchten Sie dafür actionListeners anstelle von Endlosschleifen verwenden. Wahrscheinlich möchten Sie auch einen Swing Timer und wahrscheinlich Ihre GUI in den EDT, aber ich kann nicht sagen, was mit diesen 2 Zeilen Code falsch ist, ich brauche mehr – Frakcool

+0

Leider kann ich es nicht innerhalb eines actionListener verwenden, außer es ist möglich, meine sehr zu schreiben eigener actionListener. –

Antwort

3

In vielen verschiedenen UI-Frameworks ist es üblich, dass die Methoden, die Sie aufrufen, einige Aufgaben in die Warteschlange stellen, anstatt sie sofort auszuführen. Nach Ihrer Beschreibung scheint es so, als ob setVisible() ein natives Fenster erstellt, aber dann das Rendering der Komponenten in eine Warteschlange stellt. Da dieser Code (vermutlich) im UI-Thread ausgeführt wird, führt er erst nach der Ausführung von activate() die in die Warteschlange eingereihte Arbeit aus.

Lang laufende Aufgaben sollten niemals auf dem UI-Thread ausgeführt werden. In Swing können Sie SwingWorker verwenden oder explizit einen Hintergrund-Thread erstellen.

+0

(1+) Lesen Sie den Abschnitt aus dem Swing-Lernprogramm zu [Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html), um weitere Informationen zu erhalten. – camickr

+0

@camickr Du hast einen Fehler gemacht;) –

+0

Du hattest Recht Ich musste es einfach auf einem anderen Thread ausführen, was ich relativ leicht herausfinden konnte. Danke für Ihre Hilfe. –

Verwandte Themen