来自 Integrating JavaFX 2.0 with Swing and SWT有一个代码允许您在 Swing JFrame 中嵌入 JFXPanel。我想知道是否有相反的情况,其中 JPanel 嵌入在 Application
中或 Stage
这相当于 JFrame
如 Converting from Swing to JavaFX? 中所述
/**
* Simple class demonstrating interoperability between Swing and JavaFX. This
* class is adapted from the example provided in the Javadoc documentation for
* {@code javafx.embed.swing.JFXPanel}.
*/
public class SwingJavaFxInteroperabilityDemo
{
private static void initAndShowGUI()
{
// This method is invoked on Swing thread
final JFrame frame = new JFrame("JavaFX / Swing Integrated");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setVisible(true);
Platform.runLater(new Runnable()
{
@Override
public void run()
{
initFX(fxPanel);
}
});
}
private static void initFX(JFXPanel fxPanel)
{
// This method is invoked on JavaFX thread
final Scene scene = TextIntegrationSceneCreator.createTextScene();
fxPanel.setScene(scene);
}
public static void main(String[] arguments)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
initAndShowGUI();
}
});
}
}
最佳答案
您可以使用 SwingNode
将摆动内容放入 JavaFX 节点。
示例应用
之前链接的 SwingNode 文档中有一个示例应用程序:
import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.*;
public class SwingFx extends Application {
@Override
public void start(Stage stage) {
final SwingNode swingNode = new SwingNode();
createAndSetSwingContent(swingNode);
StackPane pane = new StackPane();
pane.getChildren().add(swingNode);
stage.setScene(new Scene(pane, 100, 50));
stage.show();
}
private void createAndSetSwingContent(
final SwingNode swingNode
) {
SwingUtilities.invokeLater(() ->
swingNode.setContent(
new JButton("Click me!")
)
);
}
public static void main(String[] args) {
launch(args);
}
}
依赖和模块管理 如果您对 JavaFX 依赖项使用 Maven 或 Gradle,则可以使用以下方法导入用于 JavaFX/Swing 集成的库:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>16</version>
</dependency>
如果您正在使用 Jigsaw 功能编写模块化应用程序,请将以下内容放入您的 module-info.java
文件将使 JavaFX Swing 集成模块对您的应用程序可见:requires javafx.swing;
在 JavaFX 教程中嵌入 Swing Oracle 提供了一个很好的教程,用于在 JavaFX 中嵌入 Swing 内容:
本教程是为 Java 8 编写的,但仍然具有相关性。本教程涵盖线程管理和事件处理等主题,我建议任何尝试集成 JavaFX 和 Swing 的人在尝试集成之前很好地理解这些主题,否则可能会发生糟糕和不可预测的事情。
一般来说,我建议不要混合使用 JavaFX 和 Swing 代码,除非这对您的应用程序来说是绝对必要的。
Canvas 集成和重量级 Swing 组件
请注意,来自 SwingNode 文档:
The hierarchy of components contained in the
JComponent
instance should not contain any heavyweight components, otherwise,SwingNode
may fail to paint it.
重量级组件的一个例子是
Canvas
.如果您希望在 JavaFX 中使用 awt Canvas ,请参阅:具体来说,考虑使用 FXGraphics2D图书馆:
FXGraphics2D is an implementation of Java2D's Graphics2D API that targets a JavaFX canvas.
关于java - 如何将 Swing JPanel 嵌入到 JavaFX 框架中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68627459/