具有透明内容的SwingNode

时间:2015-02-04 20:33:43

标签: java swing javafx javafx-8

我正在尝试将Swing内容嵌入到更大的JavaFX应用程序中,但是我不能让嵌入式JPanel具有透明背景。 JPanel只画了一些区域。我希望绿色“透过”,即删除下图中的浅灰色背景。

Swing node with background

public class TransparentSwingNode extends Application {

    @Override
    public void start(Stage stage) {
        BorderPane pane = new BorderPane();
        pane.setStyle("-fx-background-color: green");
        final SwingNode swingNode = new SwingNode();
        BorderPane.setMargin(swingNode, new Insets(20));
        createAndSetSwingContent(swingNode);
        pane.setCenter(swingNode);
        // swingNode.setStyle("-fx-background-color: transparent"); // doesn't work

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

    private void createAndSetSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel = new DummyPanel();
                panel.setOpaque(false);
                // panel.setBackground(null); // doesn't work
                // panel.setBackground(new Color(0, 0, 0, 0)); // Doesn't work
                swingNode.setContent(panel);
            }
        });
    }

    private class DummyPanel extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.red);
            g.fillOval(getHeight() / 4, getHeight() / 4, getWidth() / 2, getHeight() / 2);
        }
    }

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

我试过

  • setOpaque(false),setBackground(null)等的各种组合
  • 将SwingNode的背景设置为透明
  • 很多搜索

更新

  • 我们找到了解决方法,请参阅答案。不过,我仍然有兴趣找到一种更稳定的方式来做这件事......

1 个答案:

答案 0 :(得分:4)

我的同事终于找到了一些东西。系统属性swing.jlf.contentPaneTransparent,即-Dswing.jlf.contentPaneTransparent=true

结果

Transparent background using system property

除了

之外,我找不到任何关于此的官方文档
  

另外,我们有一个实验性的无证选项   (“swing.jlf.contentPaneTransparent”)打开SwingNode的   透明度。这就是说我们可能不应该拒绝   透明度支持,除非这需要认真努力。