JavaFX Scene Builder: как установить цвет текста в ComboBox?

Я создал JavaFX ComboBox с помощью JavaFX Scene Builder 21.0.0.

<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.text.Font?>
<StackPane xmlns = "http://javafx.com/javafx/21" xmlns:fx = "http://javafx.com/fxml/1" maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "146.0" prefWidth = "404.0">
   <children>
      <AnchorPane prefHeight = "236.0" prefWidth = "432.0">
         <children>
            <AnchorPane layoutX = "8.0" layoutY = "14.0" prefHeight = "117.0" prefWidth = "387.0">
               <children>
                  <ComboBox layoutX = "38.0" layoutY = "47.0" prefHeight = "26.0" prefWidth = "300.0" promptText = "REINER SCT cyberJack pinpad/e-com USB 52" style = "-fx-font-weight: bold; -fx-background-color: #005f6a; -fx-font-family: &quot;Open Sans&quot;; -fx-font-size: 20.0px; -fx-text-fill: white;" />
                  <Label layoutX = "38.0" layoutY = "14.0" style = "-fx-font-weight: bold; -fx-font-family: &quot;Open Sans&quot;; -fx-font-size: 20.0px;" text = "Please select a card reader:">
                     <font>
                        <Font name = "System Bold" size = "20.0" />
                     </font>
                  </Label>
               </children>
            </AnchorPane>
         </children>
      </AnchorPane>
   </children>
</StackPane>

Я установил цвет текста на белый, но текст по-прежнему черный.

Конфигурация построителя сцен JavaFX

Есть идеи, как решить эту проблему?

Попробуйте тематику, установив -fx-base на какой-нибудь цвет (в вашем случае это может быть полезно, а может и нет).

jewelsea 28.05.2024 13:39
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
2
1
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Одним из возможных способов решения проблемы может быть добавление таблицы стилей в Scene Builder:

Css-код может выглядеть так:

.combo-box .list-cell {
    -fx-text-fill: white;
}
.combo-box-base .arrow-button .arrow {
    -fx-background-color: white;
}
Ответ принят как подходящий

Как упоминал @Billie, лучший подход — объявить стиль в CSS и включить его в SceneBuilder. Таким образом, вы точно знаете, что укладываете.

При этом основная причина того, что настройка -fx-text-fill в поле со списком не работает, заключается в том, что функция применения текстовых заливок или цветов не может быть унаследована. Только атрибуты шрифта (семейство, размер, стиль и вес) могут быть унаследованы от родительского узла. Вот почему все настройки шрифта в ComboBox применяются к внутренней метке, а не к -fx-text-fill.

Заливки текста или цвета применяются в CSS либо напрямую, либо из предварительно определенной переменной, объявленной на корневом уровне.

Ниже приведен стиль в modena.css для внутренней метки и стрелки ComboBox:

.combo-box > .list-cell {
    -fx-background: transparent;
    -fx-background-color: transparent;
    -fx-text-fill: -fx-text-base-color;
    -fx-padding: 0.333333em 0.666667em 0.333333em 0.666667em; /* 4 8 4 8 */
}
.combo-box-base > .arrow-button > .arrow {
    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
   ...
}

Если вы заметили, что цвета задаются переменными -fx-text-base-color и -fx-mark-color соответственно. Таким образом, вы можете переопределить эти переменные на уровне ComboBox, чтобы все его дочерние элементы затем использовали эти значения. (Похоже на то, что @jewelsea упомянул в своем комментарии).

Другие вопросы по теме