JavaFX Scene теряет цвет при создании кнопки - PullRequest
0 голосов
/ 27 сентября 2018

Может кто-нибудь объяснить, почему моя сцена теряет цвет, когда я создаю кнопку в 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 голосов
/ 27 сентября 2018

Цвет фона вашей сцены вообще не должен быть виден, потому что 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 class, поэтому выполняется статический блок инициализатора класса Control и загружается тема modena по умолчанию - ваш rootPane получает свой серый цвет по умолчанию из темы по умолчанию, и вы больше не видите цвет фона сцены.

0 голосов
/ 27 сентября 2018

TL; DR Установите цвет фона rootPane либо на нужный цвет, либо на Color.TRANSPARENT.

Это очень любопытный случай.

При первоначальном создании Button метод initialize вызывается в конструкторе Button:

private void initialize() {
    getStyleClass().setAll(DEFAULT_STYLE_CLASS);
    setAccessibleRole(AccessibleRole.BUTTON);
    setMnemonicParsing(true);     // enable mnemonic auto-parsing by default
}

Я предполагаю (но не могу сказать вам со 100% уверенностью), что это применяет стилиэлементам в вашем приложении (как объяснено в в этом ответе , это из-за статического инициализатора), потому что если вы создаете 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).Оба решения работали для меня.

rootNode.setBackground(new Background(new BackgroundFill(Color.CORAL, null, null)));
...