如何在嵌套控制器

时间:2016-01-18 13:24:37

标签: javafx javafx-2 javafx-8

我正在使用Java8和JavaFX开发GUI应用程序。主窗口有一个按钮,可以打开新窗口(使用它自己的fxml)。到目前为止,我每次按下按钮时都会加载fxml,但是由于新窗口有很多控件,所以(令人惊讶地)需要花费一些时间(大约0.5-1秒)来打开弹出窗口,因此我可以使用它。我更改了代码,以便主控制器在其初始化方法中加载弹出窗口fxml,每当单击该按钮时,就会显示预加载的窗口。 这一切都很好,但现在我无法在新窗口上设置initOwner(...),因为我无法访问initilize方法中的window对象。我知道我不必设置initOwner,但是我在开始菜单上有两个应用程序窗口(我想避免)。任何想法如何解决这个问题? 另外,在JavaFX中显示新窗口/对话框的标准方法是什么,我应该在每次事件发生时加载fxml还是只显示/隐藏预加载的窗口/对话框?

2 个答案:

答案 0 :(得分:2)

您可以在initialize()方法中加载一次FXML,然后在需要时懒惰地初始化对话框窗口。即。

public class Controller {

    private Parent dialogPane ;
    private Stage dialog ;

    @FXML
    private Button button ;

    public void initialize() throws IOException {
        dialogPane = FXMLLoader.load(getClass().getResource("dialog.fxml"));
    }

    @FXML
    private void handleButtonPress() {
        getDialog().show();
    }

    private Stage getDialog() {
        if (dialog == null) {
            Scene scene = new Scene(dialogPane);
            dialog = new Stage();
            dialog.setScene(scene);
            dialog.initOwner(button.getScene().getWindow());
        }
        return dialog ;
    }
}

答案 1 :(得分:0)

你可以延迟加载fxml。即不是每次点击按钮时应用程序启动与否,但是当请求时:

string connectionString = "connection String";
using (SqlConnection conn = new SqlConnection(connectionString)) {
    conn.Open();

    using (SqlCommand cmd = new SqlCommand("update TableX set Data=@data where id = @id")) {
        cmd.Parameters.AddWithValue("@Id", ParameterDirection.Input);
        cmd.Parameters.AddWithValue("@Data", streamToStore);
        cmd.Connection = conn;

        try {
            int rows = cmd.ExecuteNonQuery();

        } catch (Exception ex) {
            // store the so far written data anyway!
        }

    }
}

请注意,如果您缓存弹出窗口的内容,则可以稍后设置private Parent popupPane; private PopupPaneController popupPaneController; private void openPopup( ActionEvent event ) { if (popupPane == null) { popupPane = FXMLLoader.load(...); popupPaneController = // get it from FXMLLoader. Search this site for how } popupPaneController.updatePopupContent(newVals); Stage popup = new Stage(); popup.initOwner(primaryStage); stage.setScene(new ScrollPane(popupPane)); stage.show(); } 。另请查看Alert类作为弹出窗口的替代方法。请参阅examples of it

在显示预加载的场景/窗口时,您可能需要更新弹出窗口中显示的数据。为此在弹出控制器的类中实现一个initOwner()方法,并在每个按钮点击时调用它,如上面的代码所示。