使用 JAVAFX 使用 muose 和 TableView 的副本多选单元格

Multiselection of cells with muose and copy of TableView using JAVAFX

我有一个 TableView 是可编辑的并且启用了多个 selection。我希望向某些列和行输入新数据。然后我想 select 使用鼠标并按 CTRL-C 复制到剪贴板。

我可以使用 column.setCellFactory (TextFieldTableCell.forTableColumn ());,而且我的代码可以很好地输入 EXCEL 等数据。我不能 select 使用鼠标。

我阅读了参考资料 How can I select multiple cells in tableview with javafx only by mouse?。如果我尝试实现它,我需要使用

final Callback<TableColumn<MyDataClass, String>, TableCell<MyDataClass, String>> myCellFactory = new DragSelectionCellFactory (); column.setCellFactory (myCellFactory);

然后我无法输入任何数据,因为 CellFactory 现在不同了..

我如何输入EXCEL和select鼠标等数据并使用CTRL-C复制?感谢您的帮助。

您可以重构您提供的 link 中的代码,以便它引用另一个单元格工厂,并且 "decorates" 具有拖动功能的单元格:

public class DragSelectionCellFactory<S,T> implements Callback<TableColumn<S,T>, TableCell<S,T>> {

    private final Callback<TableColumn<S,T>, TableCell<S,T>> factory ;

    public DragSelectionCellFactory(Callback<TableColumn<S,T>, TableCell<S,T>> factory) {
        this.factory = factory ;
    }

    public DragSelectionCellFactory() {
        this(col -> new TableCell<S,T>() {
            @Override
            protected void updateItem(T item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText(null);
                } else {
                    setText(item.toString());
                }
            }
        });
    }

    @Override  
    public TableCell<S,T> call(final TableColumn<S,T> col) {            
        TableCell<S,T> cell = factory.call(col);  
        cell.setOnDragDetected(event ->  {  
            cell.startFullDrag();  
            col.getTableView().getSelectionModel().select(cell.getIndex(), col);  
        });  
        cell.setOnMouseDragEntered(event -> {  
            col.getTableView().getSelectionModel().select(cell.getIndex(), col);  
        });
        return cell ;  
    }  

} 

那你可以做

TableColumn<Person, String> column = ... 
column.setCellFactory(
    new DragSelectionCellFactory<Person, String>(TextFieldTableCell.forTableColumn()));