2017-07-25 34 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或其他你想要的东西,重要的是要添加一个监听器到相应的组件,你想使用它来选择全选无,然后一切都变得简单,我想。