CheckComboBox(ControlsFX) 设置为只读 [JavaFX]
CheckComboBox(ControlsFX) set to read only [JavaFX]
我一直在想办法将 CheckComboBox
设置为只读。
我不想禁用 CheckComboBox
因为我希望用户能够滚动并浏览已检查的项目,但是我想禁止 checking/unchecking 项目的能力.
有办法吗?
笨拙且脆弱,但有效:
public class CheckComboReadOnlySkin<T> extends CheckComboBoxSkin<T> {
public CheckComboReadOnlySkin(CheckComboBox control) {
super(control);
((ComboBox) getChildren().get(0)).setCellFactory((Callback<ListView<T>, ListCell<T>>) listView -> {
CheckBoxListCell<T> result = new CheckBoxListCell<>(item -> control.getItemBooleanProperty(item));
result.getStyleClass().add("readonly-checkbox-list-cell");
result.setDisable(true);
result.converterProperty().bind(control.converterProperty());
return result;
});
}
}
而
checkComboBox.setSkin(new CheckComboReadOnlySkin<String>(checkComboBox));
完整用法:
final ObservableList<String> strings = FXCollections.observableArrayList();
for (int i = 0; i <= 50; i++)
strings.add("Item " + i);
// Create the CheckComboBox with the data
final CheckComboBox<String> checkComboBox = new CheckComboBox<>(strings);
for (int i = 0; i< checkComboBox.getCheckModel().getItemCount(); i++) {
if (i % 3 == 0)
checkComboBox.getCheckModel().check(i);
}
checkComboBox.setSkin(new CheckComboReadOnlySkin<String>(checkComboBox));
checkComboBox.getStylesheets().add(getClass().getResource("app.css").toString());
在 app.css 期间:
.readonly-checkbox-list-cell{-fx-opacity : 1;}
.readonly-checkbox-list-cell .check-box{-fx-opacity : 1;}
结果:
我希望有人能想出更好的。
我一直在想办法将 CheckComboBox
设置为只读。
我不想禁用 CheckComboBox
因为我希望用户能够滚动并浏览已检查的项目,但是我想禁止 checking/unchecking 项目的能力.
有办法吗?
笨拙且脆弱,但有效:
public class CheckComboReadOnlySkin<T> extends CheckComboBoxSkin<T> {
public CheckComboReadOnlySkin(CheckComboBox control) {
super(control);
((ComboBox) getChildren().get(0)).setCellFactory((Callback<ListView<T>, ListCell<T>>) listView -> {
CheckBoxListCell<T> result = new CheckBoxListCell<>(item -> control.getItemBooleanProperty(item));
result.getStyleClass().add("readonly-checkbox-list-cell");
result.setDisable(true);
result.converterProperty().bind(control.converterProperty());
return result;
});
}
}
而
checkComboBox.setSkin(new CheckComboReadOnlySkin<String>(checkComboBox));
完整用法:
final ObservableList<String> strings = FXCollections.observableArrayList();
for (int i = 0; i <= 50; i++)
strings.add("Item " + i);
// Create the CheckComboBox with the data
final CheckComboBox<String> checkComboBox = new CheckComboBox<>(strings);
for (int i = 0; i< checkComboBox.getCheckModel().getItemCount(); i++) {
if (i % 3 == 0)
checkComboBox.getCheckModel().check(i);
}
checkComboBox.setSkin(new CheckComboReadOnlySkin<String>(checkComboBox));
checkComboBox.getStylesheets().add(getClass().getResource("app.css").toString());
在 app.css 期间:
.readonly-checkbox-list-cell{-fx-opacity : 1;}
.readonly-checkbox-list-cell .check-box{-fx-opacity : 1;}
结果:
我希望有人能想出更好的。