当前位置: 首页 > 知识库问答 >
问题:

JavaFX和FXML-使用来自其他控制器的数据更新标签

薛晨
2023-03-14

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

主窗口

新窗口

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个答案

计泉
2023-03-14

这是工作的示例代码(它不是最整洁的,所以我会很感激编辑)

我对模态窗口没有完全的了解,但在这里我发现了另一个与此相关的问题。

扩展应用程序的主类:

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

}
姬自强
2023-03-14

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

Stage st
st.setOnCloseRequest(e -> {

});

将允许在后台关闭(新窗口)时预执行您想要的任何代码。

然后在TextField对象上使用getText(),在主stage Label对象上使用settText()

st.initModality(Modality.APPLICATION_MODAL);

...将使它模态。

 类似资料:
  • > System.out正确显示标签上的id; 第二个控制器与嵌入在第一个控制器中的FXML文件绑定。如代码所示,第二个FXML文件/控制器是动态加载的:。 当从第二个控制器中的initialize方法设置id时,id会按预期显示在标签中: public void initialize(){this.setid(“12”);} 编辑: 此窗格声明为属性 第二个:

  • 我是的新手,我有一个和多个场景,我可以使用在它们之间切换,所有工作都很好,直到我尝试在单击菜单项时做一些事情而不是显示场景。 我试图通过使用方法类中调用,在那里我有菜单项action methods,我调用在单击菜单项时将文本写入方法中的文本字段,但在加载该场景的控制器后,什么都没有发生。这是我的代码: 类 家庭控制器类 我知道我可能忽略了一些东西,但我不知道它是什么,帮助将不胜感激。

  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类: