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