JavaFX TableView复制到剪贴板

时间:2012-07-05 15:25:23

标签: tableview javafx-2

是否可以允许用户从TableView中选择行并进行复制?

4 个答案:

答案 0 :(得分:13)

tableView.getSelectionModel().setCellSelectionEnabled(true);
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

MenuItem item = new MenuItem("Copy");
item.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        ObservableList<TablePosition> posList = tableView.getSelectionModel().getSelectedCells();
        int old_r = -1;
        StringBuilder clipboardString = new StringBuilder();
        for (TablePosition p : posList) {
            int r = p.getRow();
            int c = p.getColumn();
            Object cell = tableView.getColumns().get(c).getCellData(r);
            if (cell == null)
                cell = "";
            if (old_r == r)
                clipboardString.append('\t');
            else if (old_r != -1)
                clipboardString.append('\n');
            clipboardString.append(cell);
            old_r = r;
        }
        final ClipboardContent content = new ClipboardContent();
        content.putString(clipboardString.toString());
        Clipboard.getSystemClipboard().setContent(content);
    }
});
ContextMenu menu = new ContextMenu();
menu.getItems().add(item);
tableView.setContextMenu(menu);

答案 1 :(得分:5)

yelliver的解决方案仅复制所选单元格的内容,但显然只有明确单击的单元格才被视为已选中。 Roberto的解决方案仅在表中保存的对象可迭代时才有效。 以下是一个通用解决方案,它复制所有选定行中所有单元格的数据:

@SuppressWarnings("rawtypes")
public void copySelectionToClipboard(final TableView<?> table) {
    final Set<Integer> rows = new TreeSet<>();
    for (final TablePosition tablePosition : table.getSelectionModel().getSelectedCells()) {
        rows.add(tablePosition.getRow());
    }
    final StringBuilder strb = new StringBuilder();
    boolean firstRow = true;
    for (final Integer row : rows) {
        if (!firstRow) {
            strb.append('\n');
        }
        firstRow = false;
        boolean firstCol = true;
        for (final TableColumn<?, ?> column : table.getColumns()) {
            if (!firstCol) {
                strb.append('\t');
            }
            firstCol = false;
            final Object cellData = column.getCellData(row);
            strb.append(cellData == null ? "" : cellData.toString());
        }
    }
    final ClipboardContent clipboardContent = new ClipboardContent();
    clipboardContent.putString(strb.toString());
    Clipboard.getSystemClipboard().setContent(clipboardContent);
}

要使用Ctrl + C启用复制,请添加

    final KeyCodeCombination keyCodeCopy = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY);
    table.setOnKeyPressed(event -> {
        if (keyCodeCopy.match(event)) {
            copySelectionToClipboard(table);
        }
    });

答案 2 :(得分:3)

我无法实现Yelliver的答案,它不能为我编译,但我发现另一种非常明确的方法是将TableView的多个选定数据提取到剪贴板,如下所示

TableView tableView = new TableView();
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
MenuItem item = new MenuItem("Copy");
    item.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {

            ObservableList rowList = (ObservableList) tableView.getSelectionModel().getSelectedItems();

            StringBuilder clipboardString = new StringBuilder();

            for (Iterator it = rowList.iterator(); it.hasNext();) {
                ObservableList<Object> row = (ObservableList<Object>) it.next();

                for (Object cell : row) {
                    if (cell == null) {
                        cell = "";
                    }
                    clipboardString.append(cell);
                    clipboardString.append('\t');
                }
                clipboardString.append('\n');

            }
            final ClipboardContent content = new ClipboardContent();

            content.putString(clipboardString.toString());
            Clipboard.getSystemClipboard().setContent(content);
        }
    });
    ContextMenu menu = new ContextMenu();
    menu.getItems().add(item);
    tableView.setContextMenu(menu);
}

希望它可以帮助您,或任何想要轻松复制TableView数据的人

答案 3 :(得分:0)

我不确定,但我想javafx.scene.input.Clipboard可以帮到你。