2017-07-25 33 views
0

我有一個CheckListView顯示自定義對象的列表。我試圖實現一個選擇所有/選擇無選項,但列表視圖不會改變。如果點擊實現在CheckListView上選擇全部JavaFX

複選框只改變
pendingUsers_listView.setCellFactory(new Callback<ListView<User>, javafx.scene.control.ListCell<User>>() { 
     @Override 
     public ListCell<User> call(ListView<User> listView) { 
      return new PendingUserCell(); 
     } 
    }); 

定製手機:

public class PendingUserCell extends CheckBoxListCell<User> { 

    PendingUserCell() { 
     this.setSelectedStateCallback(new Callback<User, ObservableValue<Boolean>>() { 
      @Override 
      public ObservableValue<Boolean> call(User param) { 

       return new SimpleBooleanProperty(param.isApproved()); 
      } 
     }); 
    } 

    @Override 
    public void updateItem(User u, boolean empty) { 
     super.updateItem(u, empty); 

     if (empty) { 
      this.setText(null); 

     } else { 

      this.setText(u.getFullName() + " (" + u.getEmail() + ")"); 

     } 
    } 

} 

這些負責的行動

public void handleSelectAll() { 
     this.pendingUsers_listView.getCheckModel().checkAll(); 
     this.pendingUsers_listView.refresh(); 
} 

public void handleSelectNone() { 
this.pendingUsers_listView.getCheckModel().clearChecks(); 
this.pendingUsers_listView.refresh(); 
} 

回答

0

這裏的功能是解決方案:

我有一個Model類,它包含有關中的項目的信息,我放在那裏的名稱,顯示在該lisview和保持這樣的選中/取消值布爾屬性:

public class Model { 

    private StringProperty name; 
    private BooleanProperty selected; 

    public Model(String name, Boolean selected) { 
     this.name = new SimpleStringProperty(name); 
     this.selected = new SimpleBooleanProperty(selected); 
    } 

    public String getName() { 
     return name.get(); 
    } 

    public StringProperty nameProperty() { 
     return name; 
    } 

    public boolean isSelected() { 
     return selected.get(); 
    } 

    public BooleanProperty selectedProperty() { 
     return selected; 
    } 
} 

然後我做了一個自定義的StringConverter到模型轉換爲字符串顯示文字listView這樣的:

public class ModelConverter extends StringConverter<Model> { 
    @Override public String toString(Model object) { 
     return object.getName(); 
    } 

    @Override public Model fromString(String string) { 
     return null; 
    } 
} 

然後在控制器我加了一些項目到listView和我把作爲第一要素全選,併爲它的監聽器。所以如果你檢查它所有的項目都被檢查,如果你取消選中它,你全部變得沒有選中。下面是代碼:

public class TestController implements Initializable { 

    @FXML 
    private ObservableList<Model> data = FXCollections.observableArrayList(); 
    @FXML 
    private ListView<Model> listView; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     listView.setItems(data); 
     listView.setCellFactory(factory -> new CustomListCell(Model::selectedProperty, new ModelConverter())); 
     data.addAll(new Model("Select All", false), new Model("Apple", false), new Model("Orange", false), 
       new Model("Peach", false)); 
     data.get(0).selectedProperty().addListener(
       (observable, oldValue, newValue) -> data.forEach(item -> item.selectedProperty().set(newValue))); 
    } 

} 

所以我做了,因爲它可以很簡單,通過使用來自ListView的一個項目,但是你可以用很多方法來選擇所有選擇無,例如定義兩個獨立的checkboxeslistViewtogglebutton或其他你想要的東西,重要的是要添加一個監聽器到相應的組件,你想使用它來選擇全選無,然後一切都變得簡單,我想。