2017-07-22 4 views
0

J'ai une fenêtre avec une étiquette et un bouton, et une autre fenêtre avec un champ de texte et un bouton. De la fenêtre principale je veux ouvrir l'autre fenêtre en utilisant le bouton, entrez quelque chose dans le champ de texte sur la nouvelle fenêtre, et après avoir cliqué le bouton sur la nouvelle fenêtre je veux le fermer et l'étiquette principale de fenêtre pour mettre à jour avec le texte c'était entré. Je veux aussi que la nouvelle fenêtre soit modale.JavaFX et FXML - mettre à jour l'étiquette avec les données d'un autre contrôleur

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 
    } 
} 

Je sais qu'il est pas configuré correctement du tout, mais nous espérons qu'il explique ce que je suis en train de faire.

Répondre

0

Voici un exemple de code qui fonctionne (Il est pas le plus mignon, donc je vous serais reconnaissant de modifications)

Je n'ai pas une bonne compréhension des fenêtres modales mais here j'ai trouvé une autre question liée à cela.

principale classe qui étend l'application:

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; 
} 

classe contrôleur 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; 
} 
} 

classe 2 Contrôleur:

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

Vous avez besoin de 2 étapes pour faire ce que vous voulez (non seulement 2 scènes). Permettra de préformer tout le code que vous voulez quand votre scène se ferme (votre nouvelle fenêtre).

Ensuite, vous utilisez getText() sur votre objet TextField - et setText() sur votre objet Etiquette de la scène principale.

st.initModality(Modality.APPLICATION_MODAL); 

... Le rendra modal.