MenuBar изменяет цвет фона сцены (Java FX 8)

Почему MenuBar изменяет цвет фона сцены в этом примере кода? Он должен быть синим, но белым.

package application;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.MenuBar;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);
            scene.setFill(Color.rgb(0, 0, 255));

            primaryStage.setScene(scene);
            primaryStage.show();

            MenuBar menuBar = new MenuBar();
    }

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

person Dave Fog    schedule 06.12.2014    source источник


Ответы (1)


Белый фон, который вы видите, является фоном BorderPane. Этот цвет фона устанавливается при загрузке таблицы стилей по умолчанию.

Причина, по которой вы видите это только при создании MenuBar, заключается в том, что CSS применяется только (если вы его не принудительно) при создании первого элемента управления. Это сделано специально, чтобы предотвратить накладные расходы на загрузку таблиц стилей и применение CSS для приложений, которым они не нужны (например, для игр или моделирования, которые управляют всей своей собственной графикой). Поскольку все элементы управления стилизованы с помощью CSS, простое создание экземпляра элемента управления приводит к применению CSS.

Исправление состоит в том, чтобы сделать фон BorderPane прозрачным.

Или

root.setStyle("-fx-background-color: transparent;");

or

root.setBackground(Background.EMPTY);

Конечно, поскольку вы должны установить фон корневой панели, вы также можете установить его на синий цвет вместо установки заливки Scene:

        BorderPane root = new BorderPane();
        root.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, Insets.EMPTY)));
        Scene scene = new Scene(root,400,400);

Или вы можете использовать внешнюю таблицу стилей:

.root {
    -fx-background-color: blue ;
}

Также см. этот связанный пост и это обсуждение OTN.

person James_D    schedule 07.12.2014