【问题标题】:JavaFX TableView with ChangeListener for multiple selection带有 ChangeListener 的 JavaFX TableView 用于多选
【发布时间】:2016-01-01 17:47:55
【问题描述】:

我想在 JavaFX 8 中侦听表视图上的选择更改。如果我将 ChangeListener 添加到 MultipleSelectionModel 的 selectedItemProperty(或 selectedIndexProperty),它不会在以下情况下触发: 已经选择了多行,现在我选择了一个新的单行。如果这一行是之前被选中的最后一行,它不会做出反应。这是因为 selectedItemProperty 仅包含一项,而不是所有选定项的列表。但不幸的是,没有 selectedItems 属性,这很奇怪,因为方法 getSelectedItems() 存在。我不知道在哪里添加侦听器以使其在任何情况下都能正常工作。

这是一个示例代码:

import java.util.stream.Collectors;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MultipleSelectionTest extends Application
{
    private ListView<Integer> list = new ListView<>();
    private TableView<String> table = new TableView<>();
    private TableColumn<String, String> column1 = new TableColumn<>("Numbers");

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        HBox box = new HBox(list, table);
        primaryStage.setScene(new Scene(box, 300, 500));
        initializeTable();
        initializeList();
        primaryStage.show();
    }

    private void initializeTable()
    {
        table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        table.getColumns().add(column1);
        column1.setCellValueFactory(s -> new SimpleStringProperty(s.getValue()));
        table.setItems(FXCollections.observableArrayList("One", "Two", "Three", "Four", "Five", "Six", "Seven"));
    }

    private void initializeList()
    {
        table.getSelectionModel().selectedItemProperty().addListener((property, oldValue, newValue) ->
        {
            ObservableList<Integer> convertedItems = FXCollections.observableList(
                table.getSelectionModel().getSelectedItems()
                .stream()
                .map(this::convertNumber)
                .collect(Collectors.toList()));

            list.setItems(convertedItems);
        });
    }

    private int convertNumber(String expression)
    {
        switch (expression)
        {
            case "One": return 1;
            case "Two": return 2;
            case "Three": return 3;
            case "Four": return 4;
            case "Five": return 5;
            case "Six": return 6;
            case "Seven": return 7;
            default: throw new IllegalArgumentException();
        }
    }

    public static void main(String[] args)
    {
        launch();
    }
}

请注意,此示例中的 ListView 仅用于视觉目的。

【问题讨论】:

    标签: javafx tableview selecteditem multipleselection changelistener


    【解决方案1】:

    您不需要selectedItemsProperty - getSelectedItems 返回一个ObservableList,您可以向其中添加一个侦听器。

    拥有这个属性意味着列表对象发生了变化,但实际上发生的是列表保持不变对象,但它的内容发生了变化。

    【讨论】:

      【解决方案2】:

      这里有一个更完整的解决方案,感谢 SillyFly 响应的指针。

      在我的示例中,假设表设置为使用任意类 Person,该类定义了名字、姓氏和电子邮件。

      //Set the table to multi selection mode
      table.getSelectionModel().setSelectionMode( SelectionMode.MULTIPLE);
      
      //Regiseter the listener on the ObervableList<Person>
      table.getSelectionModel().getSelectedItems().addListener(multiSelection);
      
      
        /**A listener for list selections, multiple selections in the TableView**/
           ListChangeListener< Person> multiSelection = new ListChangeListener<Person>(){
              @Override
              public void onChanged(  ListChangeListener.Change<? extends Person> changed){
                  for( Person p : changed.getList())
                      System.out.println(p);
              } 
           };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 2014-12-23
        • 2020-10-18
        • 2017-05-10
        相关资源
        最近更新 更多