如何在 Swing 应用程序中 运行 Javafx stage/scene?
How to run Javafx stage/scene in Swing Application?
我有一个 swing 应用程序,我需要 运行 并打开 JavaFX Scene/stage。我必须 运行 它没有扩展应用程序。我已经尝试了 Whosebug 上发布的大多数解决方案,其中 none 适合我的情况。
这是我最近的尝试,我遇到了 NullPointerException。我的舞台变得空了。这一行 -> [stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));]
此时如何解决这个问题?或者有什么优雅的方法可以解决这个问题?这是代码块:
case ADMIN:
new JFXPanel();
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
Parent root = loader.load();
stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
// Give the controller access to the main app
AdminController controller = loader.getController();
controller.setMainApp();
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
break;
如有任何帮助,我们将不胜感激。
此时很可能阶段为空。 stage的初始化在哪里?
如果阶段为空,stage.setScene(...) 将抛出空指针异常。
不要在 Swing 应用程序中使用 Stage
;相反,使用 JFrame
并使用 JFXPanel
:
在其中嵌入 JavaFX 内容
case ADMIN:
// I'm assuming this code is on the AWT Event Dispatch thread
JFrame window = new JFrame();
JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(() -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
Parent root = loader.load();
jfxPanel.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
// Give the controller access to the main app
AdminController controller = loader.getController();
controller.setMainApp();
SwingUtilities.invokeLater(() -> {
window.add(jfxPanel);
window.pack();
window.setVisible(true);
});
} catch (Exception e) {
e.printStackTrace();
}
});
break;
这是我从@d.j.brown 建议的 Oracle's tutorial 中找到的解决方案。经过测试。它的工作。心想,如果有人需要的话。
但我现在 运行 我的应用程序中存在一些其他问题。自从我用过舞台。
在此解决方案中,我使用了 JFrame。如果有人知道如何在 Swing 应用程序中使用 Stage,请告诉我。谢谢。
JFrame frame = new JFrame();
frame.setUndecorated(true);
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setSize(FRAMEWIDTH, FRAMEHEIGHT);
frame.setVisible(true);
frame.setResizable(false);
Platform.runLater(new Runnable() {
@Override
public void run() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminViewSwing.fxml"));
try {
Parent root = loader.load();
Scene scene = new Scene(root, FRAMEWIDTH, FRAMEHEIGHT);
fxPanel.setScene(scene);
AdminController controller = loader.getController();
controller.setMainApp();
} catch (IOException e) {
e.printStackTrace();
}
}
});
我有一个 swing 应用程序,我需要 运行 并打开 JavaFX Scene/stage。我必须 运行 它没有扩展应用程序。我已经尝试了 Whosebug 上发布的大多数解决方案,其中 none 适合我的情况。
这是我最近的尝试,我遇到了 NullPointerException。我的舞台变得空了。这一行 -> [stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));]
此时如何解决这个问题?或者有什么优雅的方法可以解决这个问题?这是代码块:
case ADMIN:
new JFXPanel();
Platform.runLater(new Runnable() {
@Override
public void run() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
Parent root = loader.load();
stage.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
// Give the controller access to the main app
AdminController controller = loader.getController();
controller.setMainApp();
stage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
break;
如有任何帮助,我们将不胜感激。
此时很可能阶段为空。 stage的初始化在哪里?
如果阶段为空,stage.setScene(...) 将抛出空指针异常。
不要在 Swing 应用程序中使用 Stage
;相反,使用 JFrame
并使用 JFXPanel
:
case ADMIN:
// I'm assuming this code is on the AWT Event Dispatch thread
JFrame window = new JFrame();
JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(() -> {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminView.fxml"));
Parent root = loader.load();
jfxPanel.setScene(new Scene(root, SCENEWIDTH, SCENEHEIGHT));
// Give the controller access to the main app
AdminController controller = loader.getController();
controller.setMainApp();
SwingUtilities.invokeLater(() -> {
window.add(jfxPanel);
window.pack();
window.setVisible(true);
});
} catch (Exception e) {
e.printStackTrace();
}
});
break;
这是我从@d.j.brown 建议的 Oracle's tutorial 中找到的解决方案。经过测试。它的工作。心想,如果有人需要的话。
但我现在 运行 我的应用程序中存在一些其他问题。自从我用过舞台。
在此解决方案中,我使用了 JFrame。如果有人知道如何在 Swing 应用程序中使用 Stage,请告诉我。谢谢。
JFrame frame = new JFrame();
frame.setUndecorated(true);
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setSize(FRAMEWIDTH, FRAMEHEIGHT);
frame.setVisible(true);
frame.setResizable(false);
Platform.runLater(new Runnable() {
@Override
public void run() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/AdminViewSwing.fxml"));
try {
Parent root = loader.load();
Scene scene = new Scene(root, FRAMEWIDTH, FRAMEHEIGHT);
fxPanel.setScene(scene);
AdminController controller = loader.getController();
controller.setMainApp();
} catch (IOException e) {
e.printStackTrace();
}
}
});