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 内容中断的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX TabPane:如何设置选定的选项卡

JavaFX 如何隐藏Pagination的按钮?

关于iview中tabs踩到的坑

JavaFX中的样式文本?

防止JavaFX TabPane在滑动时切换选项卡

求解函数方程的最新方法是啥?