FX TabPane 中的 Swing 内容中断
Posted
技术标签:
【中文标题】FX TabPane 中的 Swing 内容中断【英文标题】:Swing Content breaking in FX TabPane 【发布时间】: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 的答案中的一些“功能”。我曾经在另一个应用程序中有一个复杂的(呃)自定义组件作为堆栈窗格中的叠加层 - 可以正常工作,但不涉及选项卡。 【参考方案1】:提醒我几年前使用 JFXPanel 时遇到的一个问题 - 您是否已经尝试过 Platform#setImplicitExit(false)?
例子:
Platform.setImplicitExit(false);
Platform.runLater(new Runnable()
public void run()
createScene();
);
【讨论】:
我不确定我是否理解正确,但即使在“x-ing out”之后,Platform.setImplicitExit(false) 也不会保持进程运行吗?如果是这样的话,我与我的问题无关。 Platform.runLater() 也是如此:据我了解,如果我想从 FX 线程外部在 FX 线程上执行任务,这将有所帮助,这不是我遇到的问题。以上是关于FX TabPane 中的 Swing 内容中断的主要内容,如果未能解决你的问题,请参考以下文章