2017-07-22 2 views
0

Ich habe ein Fenster mit einem Label und einem Button, und ein anderes Fenster mit einem TextField und einem Button. Im Hauptfenster möchte ich das andere Fenster mit der Schaltfläche öffnen, etwas in das Textfeld des neuen Fensters eingeben und nach dem Klicken auf die Schaltfläche im neuen Fenster soll es geschlossen werden und die Hauptfensterbeschriftung mit dem Text aktualisiert werden das wurde eingegeben. Außerdem möchte ich, dass das neue Fenster modal ist.JavaFX und FXML - Etikett mit Daten von einem anderen Controller aktualisieren

Main Window

New Window

public class MainController { 

    @FXML 
    public void showNewWindow() { 
     try { 
      Stage newWindowStage = new Stage(); 
      newWindowStage.setTitle("New Window"); 
      newWindowStage.initModality(Modality.APPLICATION_MODAL); 
      VBox root = FXMLLoader.load(getClass().getResource("newWindow.fxml")); 
      Scene scene = new Scene(root); 
      newWindowStage.setScene(scene); 
      newWindowStage.showAndWait(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


public class NewWindowController { 

    @FXML 
    private TextField textField; 

    @FXML 
    public void updateMainWindowLabel() { 
     // update label in main window 
     // close new window 
    } 
} 

Ich weiß, es ist nicht richtig auf alles eingerichtet, aber hoffentlich erklärt er, was zu tun ich versuche.

Antwort

0

Hier ist Beispielcode, der funktioniert (Es ist nicht das sauberste so dass ich Änderungen schätzen würde)

Ich habe nicht ein volles Verständnis von Modal Fenstern aber here ich eine andere Frage, dass im Zusammenhang gefunden.

Hauptklasse, die Anwendung erweitert:

public static void main(String[] args) { 
    Application.launch(Test.class, args); 
} 

private static Stage stage1; 
private static Stage stage2;  
private static MyExampleController controller; 

@Override 
public void start(Stage primaryStage) throws Exception { 
    stage1 = primaryStage;   
    FXMLLoader loader1 = new FXMLLoader(Test.class.getResource("/test/MyExample.fxml")); 
    AnchorPane pane1 = (AnchorPane)loader1.load(); 
    controller = loader1.getController(); 
    Scene scene1 = new Scene(pane1); 
    stage1.setScene(scene1); 

    stage2 = new Stage(); 
    FXMLLoader loader2 = new FXMLLoader(Test.class.getResource("/test/MyEx2.fxml")); 
    AnchorPane pane2 = (AnchorPane)loader2.load(); 
    Scene scene2 = new Scene(pane2); 
    stage2.setScene(scene2); 

    stage1.show(); 
} 

public static Stage getStage2(){ 
    return stage2; 
} 

public static MyExampleController getController(){ 
    return controller; 
} 

Controller-Klasse 1:

public class MyExampleController implements Initializable { 

@FXML 
private Label labLab; 
@FXML 
private Button btnButton; 

@Override 
public void initialize(URL url, ResourceBundle rb) {  
}  

@FXML 
private void clickButton(ActionEvent event) { 
    Test.getStage2().show(); 
} 

public Label getLabel(){ 
    return labLab; 
} 
} 

Controller-Klasse 2:

public class MyEx2Controller implements Initializable { 

@FXML 
private Button btnUpdate; 
@FXML 
private TextField txtField; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
}  

@FXML 
private void doUpdateForTitle(ActionEvent event) { 
    Test.getController().getLabel().setText(txtField.getText()); 
    Test.getStage2().close(); 
} 

} 
1

Sie müssen zwei Stufen tun, was Sie (nicht wollen nur 2 Szenen).

Stage st 
st.setOnCloseRequest(e -> { 

}); 

Ermöglicht es, jeden Code, den Sie möchten, wenn Ihre Bühne schließt (Ihr newWindow).

Dann verwenden Sie getText() auf Ihrem TextField-Objekt - und setText() auf Ihrer Hauptstufe Label-Objekt.

st.initModality(Modality.APPLICATION_MODAL); 

... wird es modal machen.

Verwandte Themen