从模态JavaFX获取值

时间:2016-03-19 18:51:38

标签: java javafx javafx-8

我正在使用JavaFX中的地图应用程序。这个想法是用户应该能够更新地图上区域的细节。地图是一个静态图像,其上有不可见的窗格。我在表单中有一个按钮,可以打开地图视图作为模式,突出显示相关区域。当我选择一个区域时,该区域的ID存储在要访问的不同类中并且模式关闭,但我真正想要的是将值返回到窗体的控制器并触发事件来更改标签在表格上。

显示地图的方法调用(包含在表单的控制器中):

@FXML
private void selectArea()
{
    Main.viewLoader.displayRootSelection();
}

我的视图加载器:

public void displayRootSelection(){
    Stage window = new Stage();
    currentWindow = window;
    Main.setRootInSelection(true);
    try {
        BorderPane root = FXMLLoader.load(getClass().getResource("../views/root/Root.fxml"));
        window.setResizable(false);
        window.initModality(Modality.APPLICATION_MODAL);
        window.setTitle("WIT Map");
        Scene scene = new Scene(root, 1000, 600);
        Main.setScene(scene);
        window.setScene(scene);
        window.showAndWait();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

地图上面板上的事件处理程序:

@FXML
private void panelClicked(Event e)
{
    if (Main.isRootInSelection()){
        String tempId = AreaManagement.findArea((Node)e.getSource());
        AreaManagement.setTempAreaId(tempId);
        viewLoader.getCurrentWindow().close();
    }
    System.out.println(AreaManagement.findArea((Node) e.getSource()));
}

所以我要做的是从控制器中的事件处理程序获取tempId,以便将地图映射到表单的控制器,并触发表单中的事件。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我对你的问题的理解,如果我错了,请纠正我:

使用window.showAndWait()打开模态窗口,然后在关闭窗口后,您需要从该模态窗口中获取所选结果。

假设AreaManagement方法中有displayRootSelection()可用,以下解决方案可以解决您的问题。

window.showAndWait()的文档:

  

显示此阶段并在返回调用者之前等待隐藏(关闭)。

您可以在该方法调用之后立即调用任何进一步的处理,并安全地假设模态窗口已关闭。参见:

public void displayRootSelection(Consumer<String> callback){//EDIT, usage see below
    Stage window = new Stage();
    currentWindow = window;
    Main.setRootInSelection(true);
    try {
        BorderPane root = ...;
        /*...*/
        window.showAndWait();
        // When the code reaches this position, your modal window is closed
        String tempId = AreaManagement.getTempAreaId();
        // You can call just about anything here
        callback.accept(tempId);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

编辑:将该方法调用回控制器:

在控制器中:

@FXML
private void selectArea()
{
    Main.viewLoader.displayRootSelection((selectedId) -> {
        // Do something with the ID..
    });
}

或者,你可以创建一个匿名类,而不是在这里使用lambda。