2016-07-25 2 views
0

Я пытаюсь, чтобы мой не редактируемый Combobox имел текст с текстом заливки, который немного светлее, чем фактический цвет заполнения текста (как для ввода текста).Javafx Not Editable Combobox стиль приглашения текста с CSS

Я пересек эту тему, объясняющее решение идти через переопределение клетки кнопки: JavaFX 8 - How to change the color of the prompt text of a NOT editable combobox via CSS?

Мой вопрос довольно прост: Можно ли реализовать механизм, описанный в этой статье, но через файл CSS? У меня такое ощущение, что это невозможно, но поскольку я вообще не разбираюсь в CSS, я задаюсь вопросом, мог ли я что-то пропустить.

ответ

1

A Skin можно назначить из CSS. Вы можете применить модификации к Skinnable в конструкторе Skin, что не должно быть сделано Skin.

Назначение PseudoClass всякий раз, когда не выбран ни один элемент, это может быть что-то, что может сделать Skin.

С таким псевдоклассом buttonCell может быть создан из CSS.

package combobox.promptstyle; 

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin; 
import javafx.beans.value.ChangeListener; 
import javafx.css.PseudoClass; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.SelectionModel; 

// extend default ComboBox Skin 
public class PromptSkin<T> extends ComboBoxListViewSkin<T> { 

    private static final PseudoClass PROMPT = PseudoClass.getPseudoClass("prompt"); 

    public PromptSkin(final ComboBox<T> comboBox) { 
     super(comboBox); 

     ChangeListener<Number> selectionIndexChangeListener = (observable, oldIndex, newIndex) -> { 
      getNode().pseudoClassStateChanged(PROMPT, newIndex.intValue() < 0); 
     }; 

     ChangeListener<SelectionModel> modelChangeListener = (observable, oldSelectionModel, newSelectionModel) -> { 
      if (oldSelectionModel != null) { 
       oldSelectionModel.selectedIndexProperty().removeListener(selectionIndexChangeListener); 
      } 

      if (newSelectionModel != null) { 
       newSelectionModel.selectedIndexProperty().addListener(selectionIndexChangeListener); 
       selectionIndexChangeListener.changed(null, null, newSelectionModel.getSelectedIndex()); 
      } else { 
       selectionIndexChangeListener.changed(null, null, -1); 
      } 
     }; 

     comboBox.selectionModelProperty().addListener(modelChangeListener); 
     modelChangeListener.changed(null, null, comboBox.getSelectionModel()); 
    } 

} 

Пример использования кожи:

ComboBox comboBox = ... 
comboBox.setId("combo"); 

// set stylesheet 

CSS стилей

#combo { 
    /* set skin to use */ 
    -fx-skin: 'combobox.promptstyle.PromptSkin'; 
} 

#combo:prompt > .list-cell { 
    -fx-text-fill: derive(-fx-control-inner-background,-30%); 
} 

Обратите внимание, что Skin расширяет класс от com.sun пакетов, которые могут быть подвержены изменениям.

+0

Ничего себе, это довольно изменение, чтобы получить простой текст немного легче! Итак, до сих пор нет решения, только меняя некоторые классы CSS, слишком плохо:/ – Xendar

+0

@Xendar: Обратите внимание, что если 'Skin' доступен в пути к классам, вы можете просто использовать его в свойстве CSS -fx-skin' без необходимости связать это с «ComboBox» каким-либо другим способом, что приведет к добавлению/удалению псевдокласса 'prompt', который позволяет использовать его в селекторе CSS. Я проверил, были ли классы и псевдоклассы для ячейки разными и псевдоклассифицированы по-разному (нет ': odd' /': even', но после выбора чего-то и очистки выбора это не сработает) – fabian

Смежные вопросы