2017-12-14 10 views
1

CheckComboBoxを読み取り専用に設定する方法を解明しようとしています。CheckComboBox(ControlsFX)が読み取り専用に設定されている[JavaFX]

CheckComboBoxを無効にしたくないのは、ユーザーが既にチェックしたアイテムをスクロールして調べることができるようにするためですが、アイテムのチェック/チェックを解除する必要があります。

これを行う方法はありますか?

答えて

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

結果: enter image description here

私は誰かがよりよいものを考え出すことを願っています。

関連する問題