2014-11-24 2 views
2

TableView가 정렬되거나 필터링되기 전에 TableView에서 선택한 행의 원래 인덱스를 가져 오는 방법이 있습니까? 그렇지 않다면, 대신 자신의 TableRow 객체를 만들고 선택할 때 가져오고 getOriginalRowIdex() 메서드를 가질 수 있습니까?TableView에서 선택한 TableRows 원본 인덱스 가져 오기

코드 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

원본 색인을 어떤 용도로 해결해야합니까? 일반적으로 필요한 모든 것은 TableView에 표시되는 모델 요소와 함께 저장해야하므로 추가 조회를하지 않아도됩니다. – eckig

+0

데이터가 데이터베이스에서 동적으로 추가되므로 모델을 사용하지 않습니다. 각 행마다 고유해야하는 메시지가 있습니다. – miniHessel

+0

각 행마다 고유해야하는 메시지를 가지고 있으며 모든 메시지를 문자열 목록에 저장합니다. 원래 행 인덱스가 있다면 그냥 list.get (originalIndex) – miniHessel

답변

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); 
     } 
    } 

} 
+0

감사합니다. 훌륭한 작품입니다. – miniHessel

+0

또는 Filtered/Sorted List에 대해'getSourceIndex (int)'메소드를 활용할 수도 있습니다. –

관련 문제