【问题标题】:Passing Value between Stage (JavaFx) (Eclipse)在阶段 (JavaFx) (Eclipse) 之间传递值
【发布时间】:2020-12-20 02:45:36
【问题描述】:

我有两个 .fxml 和两个 Controller。

首先显示客人信息(蓝色),当点击“添加”按钮时,它会弹出另一个阶段(灰色/白色)以搜索具有 ICnumber 的客人。

我的计划当我搜索完一位客人(灰色)后,我将点击“添加客人”按钮,舞台(灰色)将关闭,所有值将传递给客人信息(蓝色)。

    @FXML //Guest Information (blue stage)
void addGuest(ActionEvent event) throws IOException {
    iclb.setText("ok"); //ignore this
    
    Parent root = FXMLLoader.load(getClass().getResource("Guest.fxml"));

    Scene scene = new Scene(root);

    Stage stage = new Stage();
    stage.setScene(scene);
    stage.setTitle("Hotel System - Guest Information");
    stage.setResizable(false);
    stage.show();
}

public void addGuestInfo(String icno) {
    iclb.setText(icno); // this is the label for IC Number
}

--

    @FXML //Search Guest (grey stage)
void addGuest(ActionEvent event) throws IOException {
    
    FXMLLoader loader = new FXMLLoader(getClass().getResource("MenuDraft.fxml"));

    Parent root = loader.load();
    MenuController menu = loader.getController();
    menu.addGuestInfo(ictf.getText());

    Stage stage = (Stage) addbt.getScene().getWindow();
    stage.close();
}

到目前为止,我设法搜索了一位客人并能够通过单击“添加客人”按钮关闭灰色阶段,但这些值没有传递给客人信息(蓝色阶段)。

我在使用 Javafx 方面非常新……有人可以帮我解决这个问题吗?

【问题讨论】:

  • 嗨,不确定是否可以添加到回调数据或上下文中
  • 您正在第二次加载MenuDraft.fxml(大概是因为我认为您已经在其他地方加载了它),并为 UI 的第二个实例获取控制器。但是,由于 UI 的第二个实例(第二个代码块中的 root)从未在任何地方显示,因此您将永远看不到调用 addGuestInfo() 的效果。当您加载Guest.fxml 并将对第一个控制器的引用传递给它时,您可以获得对控制器的引用。或者,使用stage.showAndWait(),然后从第二个控制器获取数据。

标签: eclipse javafx scenebuilder


【解决方案1】:

在您的第二个(“灰色”)控制器中,您可以这样做:

public class AddGuestController {

    // I assume you have a Guest class to encapsulate the data in the form
    private Guest guest = null ;
    public Guest getGuest() {
        return guest ;
    }

    @FXML
    private void addGuest(ActionEvent event) {
        guest = new Guest( /* data from form controls... */ );
        addbt.getScene().getWindow().hide();
    }
}

然后回到第一个(“蓝色”)控制器,您可以使用stage.showAndWait() 阻止执行,直到窗口关闭,并检查是否创建了访客:

@FXML //Guest Information (blue stage)
private void addGuest(ActionEvent event) throws IOException {
    
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Guest.fxml"));
    Parent root = loader.load();

    Scene scene = new Scene(root);

    Stage stage = new Stage();
    stage.setScene(scene);
    stage.setTitle("Hotel System - Guest Information");
    stage.setResizable(false);
    stage.showAndWait();

    AddGuestController controller = loader.getController();
    Guest guest = controller.getGuest();
    if (guest != null) {
        // update view from guest:

        iclb.setText(guest.getIcNumber();
        // etc. 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多