我想制作" 其他"下拉菜单中的项目,能够在选择时将空值设置为语言吗?现在它只是指派其他人。
我也可以以某种方式暗淡" 其他"下拉菜单中的项目?
答案 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 ;
}