В JavaFX, как получить доступ к элементу управления в горизонтальной строке в TreeTableView - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть TreeTableView с парой столбцов.Один из столбцов имеет ProgressIndicator, который генерируется с помощью setCellFactory для TreeTableColumn.Эта таблица содержит список файлов.

Пользователь выбирает строку и нажимает кнопку загрузки, затем я получаю выбранную строку, вызывая 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();
    });

1 Ответ

0 голосов
/ 23 сентября 2019

Просто создайте класс-оболочку для File и 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;
  }

}

При использовании DataTables в JavaFx «тип» DataTable должен представлять одну строку, в вашем случае File охватывает только один столбец.
Таким образом, ваш код будет выглядеть примерно так:

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

А при действии загрузки:

download.setOnAction(event -> {
    File object = table.getSelectionModel().getSelectedItem().getValue().getFile();
    ProgressIndicator = table.getSelectionModel().getSelectedItem().getValue().getProgressIndicator()
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...