JavaFX: всплывающий список при нажатии на ячейку tableView - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть приложение с TabPanel с несколькими вкладками, каждая из которых имеет свое собственное представление таблицы.В таблицах есть файловая метаинформация.Все данные находятся в базе данных.Теперь, когда я нажимаю на строку таблицы, должно появиться окно с содержимым файла.Этот контент также находится в базе данных.Я уже проверил это:

private FileTableAccessor fileTableAccessor;  
@FXML private Tab fileTab;
@FXML private TableView<FileTableBean> fileTable;
@FXML private TableColumn<FileTableBean, String> fileFilename;
@FXML private TableColumn<FileTableBean, String> fileType;
@FXML private TableColumn<FileTableBean, String> fileModified;
@FXML private TableColumn<FileTableBean, Integer> fileSizeKb;

...

@Override
public void initialize(URL url, ResourceBundle rb) {
    try { 
        setupFileTable();     
    } catch(SQLException e){
        System.out.println(e);
}     
private void setupFileTable() throws SQLException {
    fileFilename.setCellValueFactory( new PropertyValueFactory<FileTableBean,String>("fileName"));
    fileType.setCellValueFactory( new PropertyValueFactory<FileTableBean,String>("type"));
    fileModified.setCellValueFactory( new PropertyValueFactory<FileTableBean,String>("modified"));
    fileSizeKb.setCellValueFactory( new PropertyValueFactory<FileTableBean,Integer>("sizeKb"));

    // Initialize database connection and fetch the data
    fileTableAccessor = new FileTableAccessor();
    List<FileTableBean> fileTableBeans = new ArrayList<FileTableBean>();
    fileTableBeans = fileTableAccessor.getFileList();

    // Store the filemap bean to dataBeans for possible later use
    dataBeans.setFileTableBeans(fileTableBeans);
    // Feed the data to fileTable
    fileTable.getColumns().clear();
    fileTable.getColumns().addAll(fileFilename, fileType, fileModified, fileSizeKb);
    fileTable.getItems().addAll(fileTableBeans);

    // Add "listener" for table row selection
    ObservableList selectedFileTableRow = fileTable.getSelectionModel().getSelectedItems();
    selectedFileTableRow.addListener(new ListChangeListener()  {
        @Override
        public void onChanged(Change c) {
            FileTableBean fileName = (FileTableBean)selectedFileTableRow.get(0);
            try { 
                FileTextAccessor fileTextAccessor = new FileTextAccessor();
                fileTextField.setText(fileName.getFileName());
                ObservableList<String> fileContent = FXCollections.observableArrayList(fileTextAccessor.getFileText(fileName.getFileName()));
                fileTextList.setStyle("-fx-font-family: Courier New;");
                fileTextList.setItems(fileContent);
            } catch (SQLException e) { 
                System.out.println(e); 
                e.printStackTrace();
            }
        }
    });
}

Короче, получить содержимое файла ячейки таблицы, по которому щелкнули, из базы данных и показать его в fileTextList ListView.Работает нормально, когда у меня есть отдельный уже определенный ListView.Первой попыткой было использовать простую TextArea, но она задыхается, когда есть большие текстовые файлы.Поэтому я предполагаю, что путь к диалогу здесь не пригоден, так как у всплывающего окна должен быть кольцевой буфер для потоковой передачи данных, как у ListView (хотя не уверен на 100%, есть ли у Dialog его).Есть ли более аккуратный способ сделать это, чем использовать какой-то уже определенный скрытый другой этап / окно?Версия Java - 10, и FXML также используется, если это имеет какое-либо значение.

...