通过代码关闭 fxml 窗口,javafx
Posted
技术标签:
【中文标题】通过代码关闭 fxml 窗口,javafx【英文标题】:close fxml window by code, javafx 【发布时间】:2012-11-14 01:23:25 【问题描述】:我需要通过控制器中的代码关闭当前的fxml窗口
我知道 stage.close() 或 stage.hide() 在 fx 中这样做
如何在 fxml 中实现这一点?我试过了
private void on_btnClose_clicked(ActionEvent actionEvent)
Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
但它不起作用!
我们将不胜感激所有帮助。谢谢!
【问题讨论】:
【参考方案1】:如果您不想使用 fxml 链接方法过度扩展您的控制器,您可以执行以下操作:
你必须给它一个 fx:id。例如“closeButton”。在您的 FXML 文件中应该如下所示:
<Button fx:id="closeButton" layoutX="876.0" layoutY="74.0" mnemonicParsing="false" textAlignment="CENTER">
然后你可以在你的初始化方法或任何你想要的地方对按钮进行编码:
@FXML
Button closeButton
public initialize()
closeButton.setOnAction(new EventHandler<ActionEvent>()
@Override
public void handle(ActionEvent e)
((Stage) closeButton.getScence().getWindow()).close();
);
【讨论】:
【参考方案2】:隐藏不会关闭窗口,只是进入可见模式。 最好的解决方案是:
@FXML
private void exitButtonOnAction(ActionEvent event)
((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
【讨论】:
【参考方案3】:终于找到了解决办法
Window window = ((Node)(event.getSource())).getScene().getWindow();
if (window instanceof Stage)
((Stage) window).close();
【讨论】:
【参考方案4】:如果您有一个扩展javafx.application.Application;
的窗口,您可以使用以下方法。
(这将关闭整个应用程序,而不仅仅是窗口。我误解了 OP,感谢评论者指出)。
Platform.exit();
例子:
public class MainGUI extends Application
.........
Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........
public class ExitButtonListener implements EventHandler<ActionEvent>
@Override
public void handle(ActionEvent arg0)
Platform.exit();
为 Java 8 的美而编辑:
public class MainGUI extends Application
.........
Button exitButton = new Button("Exit");
exitButton.setOnAction(actionEvent -> Platform.exit());
【讨论】:
Platform.exit()
将关闭所有阶段并关闭整个应用程序。这可能不是我们想要的。
原发帖人问的是如何关闭窗口(舞台),而不是应用程序。【参考方案5】:
stage.setOnCloseRequest(new EventHandler<WindowEvent>()
public void handle(WindowEvent we)
Platform.setImplicitExit(false);
stage.close();
);
相当于hide
。所以下次打开它时,只需检查stage
对象是否退出即可。如果退出,您只需show()
即(stage.show())
调用。否则,你必须开始舞台。
【讨论】:
【参考方案6】:我找到了一个不需要触发事件的不错的解决方案:
@FXML
private Button cancelButton;
close(new Event(cancelButton, stage, null));
@FXML
private void close(Event event)
((Node)(event.getSource())).getScene().getWindow().hide();
【讨论】:
【参考方案7】:在收到来自接受的答案的NullPointerException
后,我通过以下方式实现了这一点。
在我的 FXML 中:
<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">
在我的Controller
班级:
@FXML public void onMouseClickedCancelBtn(InputEvent e)
final Node source = (Node) e.getSource();
final Stage stage = (Stage) source.getScene().getWindow();
stage.close();
【讨论】:
【参考方案8】:-
给你的关闭按钮一个 fx:id,如果你还没有:
<Button fx:id="closeButton" onAction="#closeButtonAction">
在你的控制器类中:
@FXML private javafx.scene.control.Button closeButton;
@FXML
private void closeButtonAction()
// get a handle to the stage
Stage stage = (Stage) closeButton.getScene().getWindow();
// do what you have to do
stage.close();
【讨论】:
这种方法对我不起作用。我收到了NullPointerException
令人惊叹的作品! ,以防万一,人们记得检查您的 Button 名称(本例为 closeButton)和您的 onClick 名称(本例为 closeButtonAction)
使用此代码时出现此错误。线程“JavaFX 应用程序线程”java.lang.ClassCastException 中的异常:com.sun.javafx.stage.EmbeddedWindow 无法转换为 javafx.stage.Stage
@ZinMinn 如果你想关闭应用程序,只需调用 Platform.exit()。关闭一个阶段与关闭应用程序不同(您可以有多个阶段)。
此解决方案非常适合关闭辅助窗口。 closeButton
必须是要关闭的窗口中的按钮,并且方法 closeButtonAction()
也必须在同一类中。【参考方案9】:
我不确定这是否是最好的方法(或者是否有效),但您可以尝试:
private void on_btnClose_clicked(ActionEvent actionEvent)
Window window = getScene().getWindow();
if (window instanceof Stage)
((Stage) window).close();
(假设你的控制器是一个Node。否则你必须先获取该节点(getScene()是Node的一个方法)
【讨论】:
以上是关于通过代码关闭 fxml 窗口,javafx的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX / FXML 将 ChoiceBox 添加到根窗格
javaFX如何用Button实现跳转到一个已创建的fxml界面
groovy - javafx - 使用 WebLogic InitialContext 后无法从 FXML 打开新窗口