2016-09-03 3 views
2

Grundsätzlich habe ich ein Pop-up-Display, das ein Textfeld hat, ich möchte den Benutzer einen Namen eingeben (dann bekomme ich schließlich den Namen und später verwenden, aber das ist egal). Leider wird der Text im Textfeld nicht aktualisiert (grafisch kann das Programm immer noch das erhalten, was über tf.getText() eingegeben wurde, aber ich kann die Textaktualisierung nicht sehen).JavaFX TextField wird nicht aktualisiert Text

Stage window = new Stage(); 
    window.initModality(Modality.APPLICATION_MODAL); 
    window.setTitle("Naming"); 
    window.setMinWidth(300); 
    window.setMinHeight(200); 
    Label label = new Label(); 
    label.setText("Please type a name"); 
    Button submitButton = new Button("Submit"); 
    TextField tf = new TextField(); 
    tf.setText("Please enter a name"); 
    tf.setMaxWidth(200); 
    submitButton.setOnAction(e ->{ 
     System.out.println(tf.getText()); 
     window.close(); 
    }); 
    VBox layout = new VBox(10); 
    layout.getChildren().addAll(label, submitButton, tf); 
    Scene scene = new Scene(layout); 
    window.setScene(scene); 
    window.showAndWait(); 

Das Problem kann durch changind window.showAndWait(); nur window.show(), festgelegt werden, aber ich frage mich, ob es auch eine andere Art und Weise gelöst werden kann.

+0

Tut dies Hilfe? (http://stackoverflow.com/questions/26022699/javafx-text-fields-are-not-updating-on-gui) –

+2

Der von Ihnen bereitgestellte Code funktioniert gut, obwohl Informationen benötigt werden. Welche Java-Version verwenden Sie? über Code in JavaFX Thread? Führen Sie Lock- oder Thread.sleep() -Methoden aus, durch die die App verzögert wird? – GOXR3PLUS

Antwort

0

Die Methode showAndwait() ist ein blockierender Aufruf (seit dem Warten), und Sie führen diesen Befehl aus der Hauptereignisschleife aus und blockieren die Behandlung von Ereignissen wie das Neuanlegen des Fensters. show() ermöglicht weiter zu machen und ermöglicht daher diese Handhabung. Die Sache hier ist, dass Sie nicht in dem Bereich warten möchten, in dem Sie sich befinden, sondern die ursprüngliche Ereignisschleife blockieren, die Ihren Dialog gestartet hat. Dies könnte geschehen, indem eine andere Szene (eine Hauptszene mit der Hauptereignisschleife) diesen Dialog startet. Hier ist ein Beispielcode, der das demonstriert:

public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      // Your snippet 
      Stage window = new Stage(); 
      window.initModality(Modality.APPLICATION_MODAL); 
      window.setTitle("Naming"); 
      window.setMinWidth(300); 
      window.setMinHeight(200); 
      Label label = new Label(); 
      label.setText("Please type a name"); 
      Button submitButton = new Button("Submit"); 
      TextField tf = new TextField(); 
      tf.setText("Please enter a name"); 
      tf.setMaxWidth(200); 
      submitButton.setOnAction(e ->{ 
       System.out.println(tf.getText()); 
       window.close(); 
      }); 
      VBox layout = new VBox(10); 
      layout.getChildren().addAll(label, submitButton, tf); 
      Scene scene2 = new Scene(layout); 
      window.setScene(scene2); 

      // Root window 
      VBox layout2 = new VBox(); 
      Scene scene = new Scene(layout2,400,400); 
      Button openButton = new Button("Open"); 
      openButton.setOnAction(e -> { 
       // Launch from action handling thread 
       window.showAndWait(); 

       // Add any logic here like acquiring the entered data from 
       // the window and do interesting stuff with it 
      }); 
      layout2.getChildren().add(openButton); 
      primaryStage.setScene(scene); 

      // Launch main window with non-blocking call 
      primaryStage.show(); 


     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+1

* "Die' showAndWait() 'Methode ist ein blockierender Aufruf (seit es wartet), und Sie führen diesen Befehl aus dem GUI-Thread, der es nicht zur Verfügung stellt, das Fenster neu zu streichen." * Dies ist nur halb richtig. In der Tat "showAndWait" Blöcke, aber es tritt eine verschachtelte Ereignisschleife, die die Benutzeroberfläche aktualisiert. BTW: Der * "Action Handling Thread" * ** ist der ** GUI-Thread. – fabian

+0

Das ist richtig, wenn ich über Thread gesprochen habe, habe ich im Fall von JavaFX wirklich über Event Loops gesprochen. Ich werde in Folge bearbeiten, danke. – Memophysic

Verwandte Themen