在JavaFX中,如何在TreeTableView的特定行中访问控件

在JavaFX中,如何在TreeTableView的特定行中访问控件,javafx,Javafx,我有一个带有两列的TreeTableView。其中一个列具有ProgressIndicator,它是使用TreeTableColumn上的setCellFactory生成的。此表包含文件列表 用户选择一行并单击“下载”按钮,然后调用getSelectionModel()获取所选行,但问题是获取行(数据)的值,但如何获取我在列中注入的progressIndicator。因此,在下载文件时,我可以更新此指示器 代码如下: //Table setup with two columns; file na

我有一个带有两列的TreeTableView。其中一个列具有ProgressIndicator,它是使用TreeTableColumn上的setCellFactory生成的。此表包含文件列表

用户选择一行并单击“下载”按钮,然后调用getSelectionModel()获取所选行,但问题是获取行(数据)的值,但如何获取我在列中注入的progressIndicator。因此,在下载文件时,我可以更新此指示器

代码如下:

//Table setup with two columns; file name and progressindicator column, File is my custom class which contains file related info.
@FXML TreeTableView<File> table = new TreeTableView<>();
@FXML TreeTableColumn<File, String> fileCol = new TreeTableColumn<>();
@FXML TreeTableColumn<File, String> progressCol = new TreeTableColumn<>();

//Generating progress indicator with setCellFactory
progressCol.setCellFactory(new Callback<>() {
        @Override public TreeTableCell<File, String> call(TreeTableColumn<File, String> p) {
            return new TreeTableCell<>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setGraphic(null);
                    } else {
                            ProgressIndicator p1 = new ProgressIndicator();
                            p1.setMaxWidth(20);
                            p1.setMaxHeight(20);
                            setGraphic(p1);
                    }
                }
            };
        }
    });

//I have a download button, when it is click below code is executed
download.setOnAction(event -> {
        //Here I am getting File object but I also need to get progressindicator which is in progressCol, how I can get it?
        File object = table.getSelectionModel().getSelectedItem().getValue();
    });
//具有两列的表设置;文件名和progressindicator列,文件是包含文件相关信息的自定义类。
@FXML TreeTableView table=new TreeTableView();
@FXML TreeTableColumn fileCol=new TreeTableColumn();
@FXML TreeTableColumn progressCol=新的TreeTableColumn();
//使用setCellFactory生成进度指示器
progressCol.setCellFactory(新回调(){
@覆盖公共TreeTableCell调用(TreeTableP列){
返回新的TreeTableCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
设置图形(空);
}否则{
ProgressIndicator p1=新的ProgressIndicator();
p1.设置最大宽度(20);
p1.设置最大高度(20);
设定图形(p1);
}
}
};
}
});
//我有一个下载按钮,当它是点击下面的代码执行
下载.setOnAction(事件->{
//这里我得到的是文件对象,但我还需要得到progressCol中的progressindicator,我如何得到它?
文件对象=table.getSelectionModel().getSelectedItem().getValue();
});

只需为文件和ProgressIndicator创建一个包装类,并将其用于TreeTableView

public class FileWrapper {  
  private File file;
  private ProgressIndicator progressIndicator = new ProgressIndicator();

  public FileWrapper(File file) {
    this.file = file;
  }

  public File getFile() {
    return file;
  }

  public ProgressIndicator getProgressIndicator() {
    return progressIndicator;
  }

}
在JavaFx中使用DataTables时,DataTable的“类型”应表示一行,在您的情况下,该文件仅包含一列。
因此,您的代码如下所示:

@FXML
private TreeTableView<FileWrapper> tableView;

@FXML
private TreeTableColumn<FileWrapper, String> fileCol;

@FXML
private TreeTableColumn<FileWrapper, ProgressIndicator> progressCol;

@FXML
public void initialize() throws IOException {
    fileCol.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getValue().getFile().getName()));
    progressCol.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().getValue().getProgressIndicator()));
    progressCol.setCellFactory(param -> new TreeTableCell<>() {
        @Override
        protected void updateItem(ProgressIndicator item, boolean empty) {
            super.updateItem(item, empty);
            setText(null);
            if (item == null || empty) {
                setGraphic(null);
            } else {
                setGraphic(item);
            }
        }
    });

请回答您的问题,并附上一个演示您迄今为止所做工作的示例。请检查代码。我刚刚更新了。为什么您不创建自己的
MyCustomTreeTableColumn扩展TreeTableColumn
,并且这里声明了一些函数,如果您需要单元格相关功能,
ProgressIndicator
@Raw扩展列将不会有帮助-因此,不,这不是一个选项(如果我正确理解OP;)自定义单元实现是一种可行的方法,具有适当的数据属性来反映progress@kleopatra对不起,我指的是手机,但我指的是专栏。:)否-永远不要将节点放入数据中。相反,让它跟踪进度,并使用该数据项在自定义单元格中驱动适当的控件
download.setOnAction(event -> {
    File object = table.getSelectionModel().getSelectedItem().getValue().getFile();
    ProgressIndicator = table.getSelectionModel().getSelectedItem().getValue().getProgressIndicator()
});