CheckComboBox(ControlsFX) установлен только для чтения [JavaFX]

Я пытался выяснить, как настроить CheckComboBox для чтения- Только.

Я не хочу отключать CheckComboBox, потому что я хочу, чтобы пользователь мог прокручивать и просматривать уже отмеченные элементы, однако я хочу запретить возможность проверки/снятия отметки с элемента.

Есть ли способ сделать это?


person EDJ    schedule 14.12.2017    source источник


Ответы (1)


Хакерский и хрупкий, но работает:

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

Результат: введите здесь описание изображения

Я надеюсь, что кто-то придумает лучше.

person DVarga    schedule 14.12.2017