2016-05-17 8 views
0

Ich habe eine GUI-Klasse MyGUIClass, die JFrame erweitert. Ich möchte folgendes in Java erreichen. Ich habe in EventQueue nachgeschaut, aber irgendwie konnte ich die Dinge nicht richtig machen. Ich bin mir nicht einmal sicher, ob dies der richtige Ansatz ist.Lassen Sie JFrame GUI warten und fahren Sie fort, nachdem eine Schaltfläche gedrückt wurde

Im Haupt würde ich folgende Sequenz von Ereignissen wie:

-> JFrame starten

-> Halten Sie JFrame aktiv und warten, bis sich Play-Taste gedrückt wird. Wenn die Taste gedrückt wird,

-> Rest des Codes in main ausführen, aber GUI am Leben erhalten, um Befehle von JFrame zu erhalten.

Aber der oben genannte Versuch funktioniert nicht und der println druckt, während gui läuft, ohne irgendeine Empfehlung von GUI.

+1

Bitte veröffentlichen Sie Ihr ausführbares Beispiel, damit wir es ausführen können und sehen, was falsch ist. Sie sollten auch lesen über [Parallelität in Swing] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) –

+0

@SergiyMedvynskyy Vielen Dank für den Kommentar. Runnable ist im obigen Code definiert. Soll ich MyGUIClass() posten? – user2178841

+0

Ich möchte ein ** kurz ** (etwa 50 Zeilen Code) kompilierbares und lauffähiges Beispiel oder [SSCCE] (http://sscce.org) sehen, was Ihr Problem demonstriert. –

Antwort

2

Sie müssen einen Listener für die Schaltfläche angeben, auf die Sie einen Code ausführen möchten.

Aber wenn Sie den Code, den Sie ausführen möchten in Haupt setzen möchten. Sie werden einige anonyme Klasse benötigen usw. enthält Code oder Lambda

ich hier zeigen, wie Sie erreichen können, was Sie

class MyGUIClass extends JFrame { 
    ... 
    // I am using Runnable to contain code you want to execute. 
    // You can use Function or any class/interface you want 
    Runnable codeToExecute; 
    MyGUIClass(Runnable codeToExecute){ 
     this.codeToExecute = codeToExecute; 
     ... 
    } 

    ... 
    void yourGUImethod(){ 
     ... 
     JButton btn = new JButton(new AbstractAction(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       codeToExecute.run(); // execute code on button press 
      } 
     }); 
     yourPanel.add(btn);    // Add this button to your panel 
     ... 
    } 

wollen Jetzt können Sie die Ausführung von Code hauptsächlicher

Runnable codeToExecute =() -> {  // Using lambda 
    System.out.println("Portion to execute only after request from GUI"); 
} 

java.awt.EventQueue.invokeAndWait(new Runnable() { 
    public void run() { 
     new MyGUIClass(codeToExecute).setVisible(true); 
    } 
});  
2

Ich bin mir nicht einmal sicher, ob das der richtige Ansatz ist.

Nun, Sie haben nicht angegeben, ob dies das Hauptfenster oder ein untergeordnetes Fenster ist.

Wenn dies ein "untergeordnetes Fenster" ist und Sie zur Eingabe von Informationen aus dem Hauptfenster auffordern, sollten Sie einen modalen JDialog für das untergeordnete Fenster verwenden.

Wenn dies das "Hauptfenster" ist, dann ist es nicht der richtige Ansatz.

GUI's sind ereignisgesteuert. Dies bedeutet, dass Sie Code schreiben, um auf Ereignisse zu reagieren.

Also, wenn der Rahmen erstellt wird, erstellen Sie alle Komponenten und fügen Sie sie dem Rahmen hinzu.

Für die Schaltfläche "Play" müssen Sie einen ActionListener zu der Schaltfläche hinzufügen. Wenn Sie die Taste drücken, rufen Sie den Code auf, der sich auf die Wiedergabe bezieht.

Dann wird die GUI nur dort sitzen und auf weitere Ereignisse warten, die vom Benutzer generiert werden.

+0

Es ist ein Hauptfenster. Danke für den Kommentar. – user2178841

+0

@ user2178841, so ist das Problem gelöst? – camickr

Verwandte Themen