谁能解释为什么我在 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();
}
但是,当我创建另一个控件时,例如下面示例中的按钮(我什至不必将其添加到流程 Pane 中),颜色将恢复为灰色。
@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();
}
有谁知道这是为什么?我是否试图错误地更改背景颜色?
最佳答案
您的场景背景颜色根本不应该是可见的,因为 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.setUserAgentStylesheet
( source ) Control
的静态初始化 block 中和 PopupControl
类(source 和 source)FlowPane
不扩展Control
也不是 PopupControl
,所以 JavaFx 甚至不加载默认主题和您的 rootNode
保持透明(您会看到场景的背景颜色)。在您的其他示例中,您创建一个
Button
控制,扩展 Control
类,所以 Control
的静态初始化 block 执行类并加载默认的 modena 主题 - 您的 rootPane
从默认主题获取默认灰色,您不再看到场景的背景颜色。
关于创建按钮时 JavaFX 场景失去颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52531243/