【发布时间】:2021-05-20 03:34:46
【问题描述】:
我正在开发一个项目,该项目需要在内置 FX 的 UI 中加载现有的复杂 Swing 内容。我遇到的问题是,Swing 内容不断“中断”,使相应的 Swing 节点/FX 窗格为空。我已经构建了一个最小的工作代码示例来部分重现该问题。调整包含 3 个选项卡的窗口大小时,唯一正确显示的 Swing 节点是当前选定选项卡中的那个。通常其他两个选项卡都“中断”。
public class Main extends Application {
private final SwingNode node1 = new SwingNode();
private final SwingNode node2 = new SwingNode();
private final SwingNode node3 = new SwingNode();
@Override
public void start(Stage primaryStage) {
try {
TabPane root = new TabPane();
Tab tab1 = new Tab("Tab 1");
Tab tab2 = new Tab("Tab 2");
Tab tab3 = new Tab("Tab 3");
createAndSetSwingContent();
tab1.setContent(node1);
tab2.setContent(node2);
tab3.setContent(node3);
root.getTabs().add(tab1);
root.getTabs().add(tab2);
root.getTabs().add(tab3);
Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
e.printStackTrace();
}
}
private void createAndSetSwingContent() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JPanel panel1 = new JPanel(new BorderLayout());
JPanel panel2 = new JPanel(new BorderLayout());
JPanel panel3 = new JPanel(new BorderLayout());
JButton btn1 = new JButton("Button 1");
JButton btn2 = new JButton("Button 2");
JButton btn3 = new JButton("Button 3");
panel1.add(btn1);
panel2.add(btn2);
panel3.add(btn3);
node1.setContent(panel1);
node2.setContent(panel2);
node3.setContent(panel3);
}
});
}
public static void main(String[] args) {
launch(args);
}
}
这个问题可以重现给其他人吗?这是一个Java错误,还是我的代码中缺少某些内容?我在 Eclipse 中使用 Java 11 和 JavaFX 11。我将 JavaFX11 jar 作为用户库包含在 Classpath 中,并在 Run Configurations 中添加了以下 VM 参数:
--module-path "C:\JavaFX\javafx-sdk-11.0.2\lib" --add-modules javafx.controls,javafx.fxml,javafx.swing
【问题讨论】:
-
感谢您的意见!我将代码更改为在没有 FXML 的情况下工作。关于您的 EDT 评论:不幸的是,我完全是自学成才,对线程/fx 或 Swing 不是很熟悉...我已经包含 SwingUtilities.invokeLater(),但我不确定您的意思是什么?如果不是,你能澄清一下吗? :)
-
感谢编辑 :) 对嵌入式 swing 不太熟悉,因此无法确定,但您可能在这里遇到了错误:我可以重现一些奇怪之处:选择另一个选项卡显示黑色内容,将鼠标移到内容上最终会显示 swing 节点。
-
是的,这正是我的问题(有时我也会得到一个白色标签)!当 Swing 节点仅包含一个大按钮时,这似乎不是什么大问题,但是在原始项目中,节点要复杂得多,并且一次悬停只能显示一个组件。例如,JLabels 也保持“隐藏”...
-
我检查了我为德国 Java 论坛构建的示例。但是 Swing-in-FX 场景也很简单(内容中只有一个按钮)。 Swing 的 FX 场景更复杂,并且有点像@wzberger 的答案中的一些“功能”。我曾经在另一个应用程序中有一个复杂的(呃)自定义组件作为堆栈窗格中的叠加层 - 可以正常工作,但不涉及选项卡。