JavaFX在"其他"上设置空值ComboBox值?

时间:2015-06-16 17:51:12

标签: java javafx-8

我想制作" 其他"下拉菜单中的项目,能够在选择时将空值设置为语言吗?现在它只是指派其他人。

我也可以以某种方式暗淡" 其他"下拉菜单中的项目?

enter image description here

1 个答案:

答案 0 :(得分:1)

使用单元工厂配置下拉列表中单元格的显示。如果您希望某些值与其他值显示不同,最好的方法是在单元格上设置CSS伪类,并使用外部CSS文件来定义样式。

要配置所选项目的显示,请在组合框中设置buttonCell

这是一个完整的例子:

import java.util.Locale;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.css.PseudoClass;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class LanguageComboBoxExample extends Application {

    private static final Locale BLANK = new Locale("");

    @Override
    public void start(Stage primaryStage) {
        ComboBox<Locale> langCombo = new ComboBox<>(FXCollections.observableArrayList(
                Locale.FRENCH,
                Locale.ENGLISH,
                Locale.GERMAN,
                BLANK               
        ));

        PseudoClass otherOptionPseudoClass = PseudoClass.getPseudoClass("other-option");

        langCombo.setCellFactory(lv -> new ListCell<Locale>() {
            @Override
            public void updateItem(Locale language, boolean empty) {
                super.updateItem(language, empty);
                if (empty) {
                    setText(null);
                    pseudoClassStateChanged(otherOptionPseudoClass, false);
                } else {
                    if (language == BLANK) {
                        setText("Other");
                        pseudoClassStateChanged(otherOptionPseudoClass, true);
                    } else {

                        // this gives the display you have:
                        setText(language.getLanguage());

                        // I prefer this for usability:
                        // setText(language.getDisplayLanguage(language));

                        pseudoClassStateChanged(otherOptionPseudoClass, false);
                    }
                }
            }
        });

        langCombo.setButtonCell(new ListCell<Locale>() {
            @Override
            public void updateItem(Locale language, boolean empty) {
                super.updateItem(language, empty);
                if (language == null || language == BLANK) {
                    setText(null);
                } else {
                    setText(language.getLanguage());
                }
            }
        });

        StackPane root = new StackPane(langCombo);
        Scene scene = new Scene(root, 175, 120);
        scene.getStylesheets().add("language-combo.css");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

CSS文件(language-combo.css):

.list-cell:other-option {
    -fx-opacity: 0.5 ;
}