在对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;
});
答案 0 :(得分:1)
FilteredList
和SortedList
只是常规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);
}
}
}