JavaFX检索所选行

时间:2015-11-09 11:09:55

标签: javafx tableview tablecell

在我的JavaFX TableView中,我试图从选定的行中检索TableCells以标记它们 自定义颜色。 在这种情况下,简单地改变整行的颜色不起作用,因为我在每个单元格中使用不同的颜色阴影 关于每个细胞的价值

以下示例显示了我尝试解决问题的两种方法

1)使用侦听器检索所选行中的单元格。打印行索引和内容已经有效 但是,我找不到如何从table.getSelectionModel()。

中检索TableCell

2)尝试一种肮脏的解决方法,将TableCells添加到columnCellFactory中的全局数据结构中。 但是,由于某种原因,TableCells不会被添加到tableCells ArrayList中。

为了获得一个简短的例子,省略了导入和定义EditingCell(自定义TableCell)和CellEditEvent的类。

package TableViewColExample;

public class TableViewExample extends Application {

  private  Callback<TableColumn, TableCell> columnCellFactory ;
  final TableView<String[]> table = new TableView<String[]>();
  ObservableSet<Integer> selectedRowIndexes = FXCollections.observableSet();  
  ObservableSet<String> selectedRows = FXCollections.observableSet();  

  ArrayList<ArrayList<EditingCell>> tableColumns = new         ArrayList<ArrayList<EditingCell>>();

  @Override
  public void start(Stage stage) {
  String[][] dat = new String[][]{  
    {"C1","C2","C3"},{"a","b","c"},{"d","e","f"},{"g","i","h"}};                                                                      

  ObservableList<String []> data = FXCollections.observableArrayList();
  data.addAll(Arrays.asList(dat));
  data.remove(0);
  table.setItems(data); 

  for (int i = 0; i < dat[0].length; i++) {
  TableColumn tc = new TableColumn(dat[0][i]);
  final int colNo = i;

  tc.setCellValueFactory(new Callback<CellDataFeatures<String[], String>, ObservableValue<String>>() {
    public ObservableValue<String> call(CellDataFeatures<String[], String> p) {
           return new SimpleStringProperty((p.getValue()[colNo]));
       }    
   });

   ArrayList<EditingCell> tableCells = new ArrayList<EditingCell>();    

   columnCellFactory =
       new Callback<TableColumn, TableCell>() {
           public TableCell call(TableColumn p) {

             EditingCell tcell = new EditingCell();

             //For some reason, the EditingCell is never added to the list
             tableCells.add(tcell);
             return tcell;
           }
       };

   tc.setCellFactory(columnCellFactory);

   tableColumns.add(tableCells);

   //The printed value here is 0, which means that the Factory does not add the Editing Cell to the List
   System.out.println(" Column rows "+tableCells.size());

   table.getColumns().add(tc); 
   } 

   //Output: TableColumns 3, TableRows 0
   System.out.println("TableColumns "+ tableColumns.size() + " Table rows "+tableColumns.get(0).size());

   table.setItems(data); 
   table.getSelectionModel().getSelectedCells().addListener((Change<? extends TablePosition> change) -> {  
     selectedRows.clear();  
            table.getSelectionModel().getSelectedCells().stream().map(TablePosition::getRow).f  orEach(row -> {        
        selectedRowIndexes.add(row);  
        System.out.println(selectedRowIndexes.toString());
      });  

      table.getSelectionModel().getSelectedItems().forEach(row -> {  
        selectedRows.add(Arrays.toString(row));  
        System.out.println(selectedRows.toString());
      });               
    });  

    stage.setScene(new Scene(table));
    stage.show();
  }

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

0 个答案:

没有答案