有人能解释为什么我在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();
}
有人知道这是为什么吗?我是否尝试错误地更改背景颜色?
答案 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()
设置的,只有在以下情况下才调用该主题:
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