[英]JavaFX application doesn't close with swing content
I try to add Swing
component to JavaFX
application. 我尝试将
Swing
组件添加到JavaFX
应用程序。 I create SwingNode
object with JButton
but don't add this element to main Scene
. 我使用
JButton
创建了SwingNode
对象,但没有将此元素添加到主Scene
。 After closing main stage, application stay running. 关闭主阶段后,应用程序保持运行状态。 What I need to do to fix this?
我需要做些什么来解决这个问题?
Example here: 这里的例子:
public class SwingFx extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
AnchorPane pane1 = new AnchorPane();
AnchorPane pane2 = new AnchorPane();
pane1.getChildren().add(swingNode);
stage.setScene(new Scene(pane2, 100, 50));
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
swingNode.setContent(new JButton("Click me!"));
}
});
}
public static void main(String[] args) {
launch(args);
}
}
I don't know why it happens, but I can give you some dirty solution to fix it. 我不知道为什么会这样,但是我可以给您一些肮脏的解决方案来修复它。 Application stay running after closing if you create
SwingNode
and don't add it to Scene
. 如果创建
SwingNode
并且不将其添加到Scene
则应用程序在关闭后SwingNode
保持运行状态。 So you need to add SwingNode
to Scene
, but with zero size. 因此,您需要将
SwingNode
添加到Scene
,但大小为零。 This must fix your problem. 这必须解决您的问题。
Example: 例:
public class SwingFx extends Application {
@Override
public void start(Stage stage) {
// create pane with SwingNode
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
StackPane paneWithSwing = new StackPane(swingNode);
// create invisible pane to initialize SwingPane in Scene
Pane invisiblePane = new Pane(paneWithSwing);
invisiblePane.setPrefWidth(0);
invisiblePane.setPrefHeight(0);
invisiblePane.setOpacity(0);
// create Scene without visible SwingPane
Button button = new Button("Set SwingNode");
button.setOnAction(event -> {
invisiblePane.getChildren().clear();
stage.getScene().setRoot(paneWithSwing);
});
StackPane originalPane = new StackPane(invisiblePane, button);
stage.setScene(new Scene(originalPane, 320, 180));
stage.show();
}
private void createAndSetSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(() -> swingNode.setContent(new JButton("Click me!")));
}
public static void main(String[] args) {
launch(args);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.