在TableView中获取选定的TableRows原始索引

时间:2014-11-24 16:48:06

标签: javafx tableview

在对TableView进行排序或过滤之前,有没有办法在TableView中获取所选行的原始索引?如果没有,我可以选择创建自己的TableRow对象,在选中时获取它并使用方法getOriginalRowIdex()吗?

代码tableView.getSelectionModel().getSelectedIndex());根据排序和过滤的数据返回选定的索引,这使得行索引与列表中的索引不匹配。

 tableView.setRowFactory(tv -> {
            TableRow<ObservableList> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                   label.setText(rowMessages.get(tableView.getSelectionModel().getSelectedIndex()));

                    System.out.println(tableView.getSelectionModel().getSelectedIndex());

                }
            });
            return row;
        });

1 个答案:

答案 0 :(得分:1)

FilteredListSortedList只是常规ObservableList的包装。由于您必须拥有原始列表,因此只需使用list.indexOf()查找行中数据的索引。

public class FilteredTable extends Application {
public static void main(String[] args){launch(args);}
    @Override
    public void start(Stage stage) {
        ObservableList<LineItem> items = FXCollections.observableArrayList();
        for (int i = 0;i<10;i++){items.add(new LineItem(i+"'th", i));}

        TableView tableView = new TableView();
        FilteredList<LineItem> evens = new FilteredList<>(items, p->p.amountProperty().get()%2==0);
        SortedList<LineItem> sorted = new SortedList<>(evens);
        sorted.comparatorProperty().bind(tableView.comparatorProperty());
        tableView.setItems(sorted);

        TableColumn<LineItem,String> descCol = new TableColumn<>("desc");
        descCol.setCellValueFactory(new PropertyValueFactory<>("desc"));

        TableColumn<LineItem, Double> amountCol = new TableColumn<>("amount");
        amountCol.setCellValueFactory(new PropertyValueFactory<>("amount"));

        Label label = new Label("click a row");
        tableView.setRowFactory(tv -> {
            TableRow<ObservableList> row = new TableRow<>();
            row.setOnMouseClicked(event -> {
                if (event.getClickCount() == 2 && (!row.isEmpty())) {
                   label.setText(tableView.getSelectionModel().getSelectedIndex()
                           +" <-tbl row, idx in items-> "
                           +items.indexOf(tableView.getSelectionModel().getSelectedItem()));
                }
            });
            return row;
        });

        tableView.getColumns().addAll(descCol,amountCol);

        stage.setScene(new Scene(new VBox(5,tableView,label),300,300));
        stage.show();
    }


    public class LineItem {

        private final StringProperty desc = new SimpleStringProperty();
        private final IntegerProperty amount = new SimpleIntegerProperty();

        public StringProperty descProperty() {return desc;}
        public IntegerProperty amountProperty() {return amount;}

        public LineItem(String dsc, int amt) {
            desc.set(dsc); amount.set(amt);
        }
    }

}