2017-05-10 1 views
1

을 각 항목에 대해 CheckBox으로 간단하게 만들고 싶습니다. 이것은 완료되었습니다. 이제이 ListView에서 모든 선택된 Items를 가져 오는 방법을 찾고 있습니다.ListView에서 선택한 항목 가져 오기 | CheckBoxListCell

setCellFactory() 메서드를 사용하여 항목을 별도의 컬렉션에서 선택하고 항목을 선택 취소 할 때 제거 할 수 있다는 것을 알았습니다. 그러나 나는 이것이 이것을하는 추악한 방법이라고 생각한다.

ListView<String> listView = new ListView<>(); 
    String[] toppings = {"Cheese", "Pepperoni", "Black Olives"}; 
    listView.getItems().addAll(toppings); 
    listView.setCellFactory(CheckBoxListCell.forListView(new Callback<String, ObservableValue<Boolean>>() { 
     @Override 
     public ObservableValue<Boolean> call(String item) { 
     BooleanProperty observable = new SimpleBooleanProperty(); 
     observable.addListener((obs, wasSelected, isNowSelected) 
      -> System.out.println("Check box for " + item + " changed from " + wasSelected + " to " + isNowSelected) 
     ); 
     return observable; 
     } 
})); 

ListView에서 선택한 항목의 목록을 가져 오는 방법은 무엇입니까?

답변

3

사용이 식으로 selected 재산 않는 한

public void start(Stage primaryStage) { 
     try { 
      ListView<String> listView = new ListView<>(); 
      Button button = new Button("Get"); 
      List<String> list = new ArrayList<>(); 
      String[] toppings = { "Cheese", "Pepperoni", "Black Olives" }; 
      listView.getItems().addAll(toppings); 
      listView.setCellFactory(CheckBoxListCell.forListView(new Callback<String, ObservableValue<Boolean>>() { 
       @Override 
       public ObservableValue<Boolean> call(String item) { 
        BooleanProperty observable = new SimpleBooleanProperty(); 
        observable.addListener((obs, wasSelected, isNowSelected) -> { 
         if (isNowSelected) { 
          list.add(item); 
         } else { 
          list.remove(item); 
         } 
        }); 
        return observable; 
       } 
      })); 

      button.setOnAction(e -> { 
       for (int i = 0; i < list.size(); i++) { 
        System.out.println(list.get(i)); 
       } 
      }); 

      VBox root = new VBox(); 
      root.setAlignment(Pos.CENTER); 
      root.getChildren().addAll(listView, button); 
      Scene scene = new Scene(root, 300, 250); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
1

당신은 예를 들어 모델 클래스에 부울 속성을 추가하는 경우 :

public class Topping { 

    private final String name ; 

    private final BooleanProperty selected = new SimpleBooleanProperty(); 

    public BooleanProperty selectedProperty() { 
     return selected ; 
    } 

    public final boolean isSelected() { 
     return selectedProperty().get(); 
    } 

    public final void setSelected(boolean selected) { 
     selectedProperty().set(selected); 
    } 

    public Topping(String name) { 
     this.name = name ; 
    } 

    public String getName() { 
     return name ; 
    } 

    @Override 
    public String toString() { 
     return getName(); 
    } 
} 

및 확인란 목록 셀에 사용 :

listView.setCellFactory(CheckBoxListCell.forListView(Topping::selectedProperty)); 

는 다음 방금 필터링 된 목록을 만들 수있는 선택한 모든 토핑을 포함합니다 :

ListView<Topping> listView = new ListView<>(); 
listView.getItems().addAll(new Topping("Cheese"), new Topping("Pepperoni"), 
    new Topping("Black Olives")); 

ObservableList<Topping> selectedToppings = 
    listView.getItems().filtered(Topping::isSelected); 

이제 selectedToppings은 항상 정확하게 목록보기에서 체크 상자가 선택된 토핑

0

는 이제 사용자 상호 작용 내가 피하려고 할 모델로 필요 혼합하는 모델의 일부입니다.

예를 들어 항목을 다른 곳으로 옮기는 두 개의 목록을 만드는 경우이 속성을 계속 사용 하시겠습니까? 아니면 해당 목록의 봉쇄로 충분합니까?

(피자?) 예를 들어 사용자에게 한 번 확인 된 주문에는 선택한 토핑 만 포함되어야합니다. 피자 주문에 가능한 모든 토핑이 포함되어 있고 주방이 반복해야한다면 이상한 모델이됩니다. 필요한 토핑을 찾기 위해 목록. 이는 그것이 선택되었다는 사실이 모델의 일부가 아니라 사용자 상호 작용 항목이라는 강력한 표시입니다.

사용자 인터페이스 및 모델 당신이뿐만 아니라 검사 항목을 조회 할 수 allowes CheckModel이있는 ControlsFX 라이브러리의 CheckListView를 사용할 수있는 혼합되지 않도록, 그러나 당신의 논리가 그렇게하도록 요구하는 경우도를 조작합니다.

관련 문제