Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX和FXML-使用来自另一个控制器的数据更新标签_Java_Javafx_Fxml - Fatal编程技术网

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

JavaFX和FXML-使用来自另一个控制器的数据更新标签,java,javafx,fxml,Java,Javafx,Fxml,我有一个带有标签和按钮的窗口,还有一个带有文本字段和按钮的窗口。在主窗口中,我希望使用按钮打开另一个窗口,在新窗口的文本字段中输入内容,单击新窗口上的按钮后,我希望它关闭,主窗口标签使用输入的文本更新。我还希望新窗口是模态的 我知道它的设置根本不正确,但希望它能解释我要做的事情。下面是一些有效的示例代码(它不是最整洁的,所以我希望能编辑) 我并不完全了解模态窗口,但我发现了另一个与之相关的问题 扩展应用程序的主类: public static void main(String[] args)

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


我知道它的设置根本不正确,但希望它能解释我要做的事情。

下面是一些有效的示例代码(它不是最整洁的,所以我希望能编辑)

我并不完全了解模态窗口,但我发现了另一个与之相关的问题

扩展应用程序的主类:

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 void updateLabel(String newLabelText){
   this.labLab.setText(newLabelText);
}
}
控制器类别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().updateLabel(txtField.getText());
    Test.getStage2().close();
}

}

你需要两个阶段来完成你想要的(而不仅仅是两个场景)

当你的舞台关闭(你的新窗口)时,将允许预执行任何你想要的代码

然后在TextField对象上使用
getText()
,在主stage标签对象上使用
setText()

st.initModality(Modality.APPLICATION_MODAL);
…将使其成为模态

Stage st
st.setOnCloseRequest(e -> {

});
st.initModality(Modality.APPLICATION_MODAL);