JavaFX和FXML - 使用来自另一个控制器的数据更新标签

时间:2017-07-22 09:59:43

标签: java javafx fxml

我有一个带有Label和Button的窗口,另一个带有TextField和Button的窗口。在主窗口中我想使用按钮打开另一个窗口,在新窗口的文本字段中输入内容,然后单击新窗口上的按钮,我希望它关闭,主窗口标签用文本更新那是进入的。此外,我希望新窗口是模态的。

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

我知道它根本没有设置,但希望它解释了我想要做的事情。

2 个答案:

答案 0 :(得分:1)

你需要2个阶段来做你想要的(不仅仅是2个场景)。

Stage st
st.setOnCloseRequest(e -> {

});

允许在舞台关闭时(newWindow)预先形成您想要的任何代码。

然后在TextField对象上使用getText(),并在主舞台Label对象上使用setText()

st.initModality(Modality.APPLICATION_MODAL);

......会使它成为模态。

答案 1 :(得分:0)

这是一个有效的示例代码(它不是最好的,所以我很感激编辑)

我没有充分了解模态窗口,但here我发现了另一个与此相关的问题。

扩展应用程序的主类:

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

控制器类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;
}
}

控制器类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();
}

}