CheckComboBox(ControlsFX)设置为只读[JavaFX]

时间:2017-12-14 10:12:48

标签: java javafx readonly controlsfx

我一直试图弄清楚如何将CheckComboBox设置为只读。

我不想禁用CheckComboBox,因为我希望用户能够滚动并查看已经检查的项目,但是我想要禁止检查/取消选中项目的能力。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

Hacky和脆弱,但有效:

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

结果: enter image description here

我希望有人会想出一个更好的。