JavaFX和SwingNode - 部分黑色窗口

时间:2015-01-27 17:01:37

标签: java swing javafx-8

我尝试使用SwingNode在JavaFX中使用Swing组件:

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按钮)是黑色的:

enter image description here

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

enter image description here

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

3 个答案:

答案 0 :(得分:0)

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

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

它在java 8 update 40中修复。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我已经找到了一个“糟糕的”解决方案,但是对我有用,在显示了舞台之后,以延迟的方式重新绘制了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);
    }
}

有点晚了,但希望对您有所帮助!