【问题标题】:JavaFX and SwingNode - partial black WindowJavaFX 和 SwingNode - 部分黑色窗口
【发布时间】:2015-03-26 09:18:38
【问题描述】:

我尝试将 JavaFX 中的 Swing 组件与 SwingNode 一起使用:

public class MyTest extends Application {

    @Override
    public void start(Stage stage) {

        final SwingNode swingNode = new SwingNode();
        FlowPane pane = new FlowPane();

        Button btn = new Button("1");
        btn.setVisible(false);
        pane.getChildren().add(btn);

        createAndSetSwingContent(swingNode);
        pane.getChildren().add(swingNode);


        stage.setScene(new Scene(pane, 100, 50));

        stage.show();

        btn.setVisible(true);

    }

    private void createAndSetSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                swingNode.setContent(new JButton("Click me!"));
            }
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

启动应用程序后,窗口的某些部分(背景和 JavaFX 按钮)是黑色的:

调整大小(或其他更新)后,窗口正确显示:

为什么会这样,我该如何解决?

【问题讨论】:

  • 您的代码看起来与sample SwingNode code in Javadoc 几乎相同,所以我不知道为什么它不适合您。我的猜测是这个问题是特定于环境的。也许在您的问题中添加您的环境的详细信息(Java 版本、操作系统版本、图形硬件、图形驱动程序)。如果您愿意,您也可以使用此信息在JavaFX issue tracker 中提交报告。 FWIW,我使用 OS X 10.9 + Java 8u25,没有什么是黑色的 - 一切正常。
  • 那是什么版本的JDK?
  • 我的环境的详细信息:Windows 8.1 Pro AMD Radeon HD 7800 驱动程序版本下的 Java SE 1.8 Development Kit 8 Update 31 (64bit) 驱动程序版本:14.501.1003-141120a-178000C

标签: java swing javafx-8


【解决方案1】:

问题是 java 8 update 31 中的一个已知错误。

(https://javafx-jira.kenai.com/browse/RT-37810)

在 java 8 update 40 中已修复。

【讨论】:

  • 目前使用 JDK 11,bug 仍在发生。
【解决方案2】:

objSwingNode.requestFocus(); objSwingNode.autosize();

【讨论】:

    【解决方案3】:

    我找到了一个“糟糕”的解决方案,但这对我有用,在显示舞台后以延迟的方式重新绘制 Swing 组件:

    new Timer().schedule(new TimerTask() {
            public void run() {
                swingNode.getContent().repaint();
            }
        }, 500L);
    

    所以,您的代码将如下所示:

    public class MyTest extends Application {
    
        @Override
        public void start(Stage stage) {
    
            final SwingNode swingNode = new SwingNode();
            FlowPane pane = new FlowPane();
    
            Button btn = new Button("1");
            btn.setVisible(false);
            pane.getChildren().add(btn);
    
            createAndSetSwingContent(swingNode);
            pane.getChildren().add(swingNode);
    
    
            stage.setScene(new Scene(pane, 100, 50));
    
            stage.show();
    
            btn.setVisible(true);
    
            // delays Swing component repaint 1/2 sec.
            new Timer().schedule(new TimerTask() {
                    public void run() {
                        swingNode.getContent().repaint();
                    }
                }, 500L);
    
        }
    
        private void createAndSetSwingContent(final SwingNode swingNode) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    swingNode.setContent(new JButton("Click me!"));
                }
            });
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    有点晚了,希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2013-01-17
      • 2021-11-17
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多