JavaFX检索所选行的TableCells

JavaFX检索所选行的TableCells,javafx,tableview,tablecell,Javafx,Tableview,Tablecell,在我的JavaFXTableView中,我试图从所选行检索TableCell以标记它们 用定制的颜色。 在这种情况下,仅更改整行的颜色不起作用,因为我在每个单元格中使用不同的颜色着色,具体取决于 关于每个单元格的值 下面的例子显示了我试图解决这个问题的两种方法 1) 使用侦听器检索选定行中的单元格。打印行索引和内容已起作用 但是,我找不到如何从table.getSelectionModel()检索TableCell 2) 尝试将TableCells添加到columnCellFactory中的全局

在我的JavaFXTableView中,我试图从所选行检索TableCell以标记它们 用定制的颜色。 在这种情况下,仅更改整行的颜色不起作用,因为我在每个单元格中使用不同的颜色着色,具体取决于 关于每个单元格的值

下面的例子显示了我试图解决这个问题的两种方法

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);
  }
}
package tableviewcole示例;
公共类TableViewExample扩展了应用程序{
私人工厂;
最终的TableView表格=新的TableView();
ObservableSet selectedRowIndexes=FXCollections.ObservableSet();
ObservableSet selectedRows=FXCollections.ObservableSet();
ArrayList tableColumns=新的ArrayList();
@凌驾
公众假期开始(阶段){
字符串[][]dat=新字符串[][]{
{“C1”、“C2”、“C3”}、{“a”、“b”、“c”}、{“d”、“e”、“f”}、{“g”、“i”、“h”};
ObservableList data=FXCollections.observableArrayList();
data.addAll(Arrays.asList(dat));
数据删除(0);
表2.设置项目(数据);
对于(int i=0;itable.getSelectionModel().getSelectedCells().addListener((更改)不要这样做。对于单元机制如何工作(在什么情况下创建新单元等),没有提供足够的实现信息,您无法可靠地获取对“活动”单元的引用并以这种方式更新它们(而且您可能会面临内存泄漏的风险,因为您可能会持有对其他任何地方都没有引用的单元格的引用)。您可以通过单元格(或行)的组合来管理颜色,甚至是动态的工厂和CSS,但您需要更全面地解释您试图实现的目标。我正在尝试在选择列并按下按钮后更改选定行或列中单元格的颜色底纹。新的颜色底纹应根据单元格中以前的颜色进行计算。目前,我正在使用一种解决方法,为在TableCell中使用特定于lor的字符串来更新item(),并存储每个单元格的上一个值。这对于我的应用程序来说已经足够了,但还不足以作为答案发布。if(item.equals(“--red-->”){String value=this.prevValue;super.UpdateItem(item,empty);setStyle(--fx background color:red”);this.setText(value);this.setItem(值);setGraphic(图形);事件事件=新CellEditEvent(值);this.fireEvent(事件);}这听起来好像列的类型不对:即,您应该在属性中存储实际颜色,而不是
String
s。一般来说,您需要首先考虑数据,然后将单元格表示作为数据的视图。如果您获得了正确的数据,那么单元格工厂应该更多或更多少写自己。只有约150行(包括cell factory),据我所知,它不会对缓存表单元格进行任何攻击。在按下按钮时高亮显示行,不确定您的操作是否会增加任何内容。