创建按钮后,JavaFX Scene失去颜色

时间:2018-09-27 07:00:42

标签: javafx colors scene

有人能解释为什么我在JavaFX中创建按钮后场景会失去色彩吗?

以下代码有效,场景背景变为红色

@Override
public void start(Stage primaryStage){

    //Set Primary stage title and create a rootNode
    primaryStage.setTitle("Hello World");
    FlowPane rootNode = new FlowPane();

    //Create a scene and add it to the rootNode
    Scene myScene = new Scene(rootNode, 300, 200, Color.RED);

    //Add the scene to the stage
    primaryStage.setScene(myScene);

    //Show the stage
    primaryStage.show();
}

但是,当我创建另一个控件(例如下面的示例中的按钮)时(我甚至不必将其添加到流窗格中),颜色就会恢复为灰色。

@Override
public void start(Stage primaryStage){

    //Set Primary stage title and create a rootNode
    primaryStage.setTitle("Hello World");
    FlowPane rootNode = new FlowPane();

    //Create a scene and add it to the rootNode
    Scene myScene = new Scene(rootNode, 300, 200, Color.CORAL);

    Button newBtn = new Button();

    //Add the scene to the stage
    primaryStage.setScene(myScene);

    //Show the stage
    primaryStage.show();
}

有人知道这是为什么吗?我是否尝试错误地更改背景颜色?

2 个答案:

答案 0 :(得分:2)

您的场景背景颜色根本不可见,因为rootNode覆盖了整个场景,并且rootNode具有自己的背景颜色,该背景颜色在默认JavaFx主题中设置(即您的灰色正在查看):

//modena.css

.root {
  ... 

  /***************************************************************************
   *                                                                         *
   * Set the default background color for the scene                          *
   *                                                                         *
   **************************************************************************/

   -fx-background-color: -fx-background;
}

因此,您需要更改rootNode的背景颜色,正如其他答案已经建议的那样。

剩下的问题是,为什么在第一个示例中,默认的根背景色未应用于rootNode(它是透明的,而不应该是),而是看到了场景的背景色。

答案-可能是一个错误。在JavaFx中,默认主题是通过方法PlatformImpl.setDefaultPlatformUserAgentStylesheet()设置的,只有在以下情况下才调用该主题:

  • 呼叫Application.setUserAgentStylesheetsource)时
  • ControlPopupControl类(sourcesource)的静态初始化程序块中

FlowPane既不扩展Control也不扩展PopupControl,因此JavaFx甚至不加载默认主题,并且rootNode保持透明(您可以看到场景的背景色)。

在另一个示例中,您将创建一个Button控件,该控件扩展了Control类,因此将执行Control类的静态初始值设定项块并加载默认的Modena主题-您的{{ 1}}从默认主题获得其默认的灰色,您将不再看到场景的背景色。

答案 1 :(得分:0)

TL; DR az container create的背景色设置为所需的颜色或rootPane

这是一个非常奇怪的情况。

最初创建Color.TRANSPARENT时,会在Button的构造函数中调用Button方法:

initialize

我假设(但我不能100%肯定地告诉您)这会将样式应用于您应用中的元素(如this answer中所述,这是因为有一个静态初始化程序),因为如果您创建private void initialize() { getStyleClass().setAll(DEFAULT_STYLE_CLASS); setAccessibleRole(AccessibleRole.BUTTON); setMnemonicParsing(true); // enable mnemonic auto-parsing by default } (甚至不将其添加到Button中),rootNode在调用rootNode之后都会有背景。为了证明这一点,我修改了您的代码:

primaryStage.show()

输出看起来像这样(背景颜色为灰色):

System.out.println("background: " + rootNode.getBackground());
Button newBtn = new Button();
primaryStage.setScene(myScene);
primaryStage.show();
System.out.println("background after showing scene: " + rootNode.getBackground());

如果我删除创建的按钮并再次运行它,则背景颜色为红色,并且输出如下:

background: null
background after showing scene: javafx.scene.layout.Background@20c95282

因此,我建议您将背景色设置为background: null background after showing scene: null 或将rootNode的背景色显式设置为透明(rootNode)。两种解决方案都对我有用。

Color.TRANSPARENT