JavaFx SwingNode - 随机显示黑色、背景或组件

Los*_*ost 5 java debugging swing javafx

我在 JavaFx 的 SwingNode 显示 Java 1.8.0_102-b14 中包含的组件时遇到问题。我不确定这个问题是否是由于我的 Java 版本太旧、当前(如果我的是当前)Java 版本中的错误或我执行错误的某些 SwingNode 进程所致。我知道这个问题在JavaFX 和 SwingNode - 部分黑色窗口之前就已报告过,所以我真的在寻找有关我的 Java 版本的反馈。

此代码通常会错误地显示“button1”,如黑色或背景色,直到鼠标悬停在其上或单击它。这对我来说不是一个理想的解决方法,因为我的项目在 Fx 项目中使用了更复杂的摆动面板,不幸的是,纯 Fx 不是一个选择。

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

import javax.swing.JButton;

public class Test extends Application {

  @Override
  public void start(Stage stage) {
      final SwingNode swingNode1 = new SwingNode();
      final SwingNode swingNode2 = new SwingNode();

      swingNode2.setContent(new JButton("Click me!"+2));
      swingNode1.setContent(new JButton("Click me!"+1));

      BorderPane pane = new BorderPane();
      pane.setLeft(swingNode1);
      pane.setRight(swingNode2);

      stage.setScene(new Scene(pane, 200, 50));
      stage.show();
  }

  public static void main(String[] args) {
      launch(args);
  }
}
Run Code Online (Sandbox Code Playgroud)

在创建此 sssce 时,我发现在设置右侧 SwingNode 中的内容之前设置左侧 SwingNode 中的内容可以纠正此简单代码的问题,但不能纠正我的较大项目。所以我猜测这是内存泄漏,但我无法从我的机器上看出。

有人可以测试这段代码并看看他们是否得到类似的结果吗?

编辑:感谢您的快速反馈,请不要关注按钮,因为它们只是演示我的问题的工具。这种奇怪的功能与其他对象(而不是按钮)的作用方式相同。

Jam*_*s_D 3

必须在 AWT 事件调度线程上创建并显示 Swing 组件(请参阅Swing 的线程策略)。该Application.start()方法在 FX 应用程序线程上调用

因此你需要

public class Test extends Application {

  @Override
  public void start(Stage stage) {
      final SwingNode swingNode1 = new SwingNode();
      final SwingNode swingNode2 = new SwingNode();

      SwingUtilities.invokeLater(() -> {
          swingNode2.setContent(new JButton("Click me!"+2));
          swingNode1.setContent(new JButton("Click me!"+1));
      });

      BorderPane pane = new BorderPane();
      pane.setLeft(swingNode1);
      pane.setRight(swingNode2);

      stage.setScene(new Scene(pane, 200, 50));
      stage.show();
  }

  public static void main(String[] args) {
      launch(args);
  }
}
Run Code Online (Sandbox Code Playgroud)