JavaFX ComboBox项目上的文本颜色仅在首次选择后更改

时间:2014-07-09 22:28:28

标签: java css combobox javafx-8 scenebuilder

我正在使用Windows 7中的SceneBuilder 2.0在e(fx)clipse中从Java 8.0构建JavaFx中的输入表单。

我有一个简单的String ComboBox,想要更改列表和所选String中字体的颜色和大小。我使用的CSS代码更改了所选项目上的文本。但是,第一次删除列表时,它是黑色默认字体。第二次,所有项目的字体颜色和大小已更改为正确的值。

如何使字体列表以正确的颜色和大小启动?

以下是我的Controller类中initialize方法的简化代码:

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; 
 }

1 个答案:

答案 0 :(得分:3)

你必须创建一个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,您could set this via CSS但仍然必须使用CellFactory。