2017-05-10 1 views
1

ListViewCheckBoxと簡単に作成したいと思います。これが完了しました。今、私は、このListViewからすべての選択された項目を取得する方法を探しています。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

を使用して、私は避けるようにしようと、あなたのモデルとする必要があります。

たとえば、アイテムを相互に移動する2つのリストを作成する場合は、このプロパティを使用するか、そのリスト内の包含が十分ですか?

あなたの(ピザ?)の例では、ユーザーに一度確認された注文には、選択されたトッピングのみが含まれているはずです。ピザの注文にすべての可能なトッピングが含まれていてキッチンが反復しなければならない必要なトッピングを見つけるためのリスト。これは、選択されているという事実がモデルの一部ではなく、ユーザー対話項目であることを強く示しています。あなたがチェックされた項目を照会することができallowes、また、あなたのロジックはそうすることが必要となる場合は、それを操作するだけでなく、CheckModelを持ってControlsFXライブラリのCheckListViewを使用することができ、ユーザインターフェースとモデルを混合避けるため

関連する問題