如何在JavaFx中的ListView中编程选择多个项目?

时间:2017-07-08 02:24:35

标签: javafx-8

Oracle docs说“selectIndices”:此方法允许同时设置一个或多个选择。 selectIndices(int index,int ... indices) https://docs.oracle.com/javafx/2/api/javafx/scene/control/MultipleSelectionModel.html

它不接受int []数组。它接受以逗号分隔的整数:

list.getSelectionModel().selectIndices(0,2);

但是如何在程序中执行此操作? 我可以在ListView中手动选择多个项目。

1 个答案:

答案 0 :(得分:0)

它接受int[]数组,但仅作为第二个参数。唯一的不便是确保您传递至少一个索引的第一个参数 幸运的是,selectIndices's contract还包含一个允许您将值作为第一个参数传递的部分:

  

它将忽略任何不在有效范围内的值(即大于或等于零,并且小于基础数据模型中的项目总数)。

因此,您可以安全地将-1作为第一个参数传递,并将所有索引作为第二个参数选择。

实施例

private static void select(ListView<?> listView, int divisor, int remainder) {
    MultipleSelectionModel<?> selectionModel = listView.getSelectionModel();

    // create array of indices to select        
    final int size = listView.getItems().size();
    int selectionSize = size / divisor;
    if (size % divisor > remainder) {
        selectionSize++;
    }
    int[] selectedIndices = new int[selectionSize];
    for (int i = 0, value = remainder; i < selectionSize; i++, value += divisor) {
        selectedIndices[i] = value;
    }

    // unselect currently selected items
    selectionModel.clearSelection();

    // select indices in the array
    selectionModel.selectIndices(-1, selectedIndices);
}

@Override
public void start(Stage primaryStage) {
    ListView<Integer> listView = new ListView<>();
    listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

    for (int i = 0; i < 99; i++) {
        listView.getItems().add(i);
    }

    Button btn = new Button("Select Even");
    btn.setOnAction(evt -> select(listView, 2, 0));

    Button btn2 = new Button("Select Odd");
    btn2.setOnAction(evt -> select(listView, 2, 1));

    Scene scene = new Scene(new VBox(10, listView, btn, btn2));

    primaryStage.setScene(scene);
    primaryStage.show();
}