Цвет текста в элементах JavaFX ComboBox изменяется только после первого выбора

Я создаю форму ввода в JavaFx из Java 8.0, используя SceneBuilder 2.0 в Windows 7 в e (fx) clipse.

У меня есть простой String ComboBox, и я хочу изменить цвет и размер шрифтов как в списке, так и в выбранной String. Код css, который я использую, изменяет текст выбранного элемента. Однако при первом удалении список отображается черным шрифтом по умолчанию. Во второй раз цвет и размер шрифта на всех элементах изменились на правильные значения.

Как заставить список шрифтов запускаться с правильным цветом и размером?

Вот упрощенный код из метода инициализации в моем классе контроллера:

ObservableList<String> types = FXCollections.observableArrayList
    ( "large", "medium", "small" );

comboBox.setItems( types );

и текущий css:

#comboBox .list-cell
 {
    -fx-font-family: arial;
    -fx-font-size: 16px;
    -fx-text-fill: #a0522d; 
 }

person MantaMan    schedule 09.07.2014    source источник
comment
Просто предложение, попробуйте combo.show () и combo.hide () в Platform.runLater при запуске приложения.   -  person Uluk Biy    schedule 10.07.2014
comment
Хорошая идея, но не вышло. Как ни странно, я могу предварительно установить семейство и размер шрифта с помощью comboBox.setStyle (), но предварительная установка цвета не работает, как в comboBox.setStyle (-fx-text-fill: # a0522d;) ;.   -  person MantaMan    schedule 10.07.2014


Ответы (1)


Вам нужно создать CellFactory, и вы не можете использовать CSS (я не знаю почему, но это единственный способ заставить его работать):

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

public class Mainu extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        ComboBox<String> cb = new ComboBox<String>();
        cb.setItems(FXCollections.observableArrayList("Foo","Bar","777","Batman"));
        cb.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
            @Override public ListCell<String> call(ListView<String> p) {
                return new ListCell<String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                            if (item != null) {
                                setText(item);  
             //This won't work for the first time but will be the one
             //used in the next calls
                                getStyleClass().add("my-list-cell");
                                setTextFill(Color.RED);
                                //size in px
                                setFont(Font.font(16));
                            }
                    }
                };
            }
        });
        cb.getSelectionModel().selectFirst();
        Pane root = new Pane();
        root.getChildren().add(cb);
        Scene scene = new Scene(root);
        scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {launch(args);}
}

Несмотря на то, что вы используете стандартный API, я считаю, что вам также следует использовать его в CSS и указать в CSS, что первый раз нужно установить программно, так как это будет полезно для тех, кто будет поддерживать ваше программное обеспечение.

style.css

.combo-box .cell{
    -fx-text-fill: blue;
    -fx-font: 16px "Arial";
}
.my-list-cell {
    -fx-text-fill: blue;
    -fx-font: 16px "Arial";
    /* No alternate highlighting */
    -fx-background-color: #FFF;
}

Любопытная деталь: для JavaFX 2 вы можете установить это через CSS, но все же пришлось использовать CellFactory.

person Mansueli    schedule 08.08.2014