Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaFX TableView copy to clipboard

Is it possible to allow a user to select rows and copy from a TableView?

like image 551
DD. Avatar asked Jul 05 '12 15:07

DD.


3 Answers

I couldn't implement Yelliver's Answer, it doesn't compile for me, but I found another very clear way to extract to clipboard the TableView's multiple selected data, it goes as follows

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

Hope it can help you, or anyone trying to copy easily TableView's data

like image 97
José Roberto Ramírez Aguilar Avatar answered Nov 16 '22 18:11

José Roberto Ramírez Aguilar


yelliver's solution only copies the content of selected cells, but apparently only cells that were explicitly clicked on are considered selected. Roberto's solution only works if the objects held in the table are iterable. Here is a general solution that copies the data from all cells in all selected rows:

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

To enable copying with Ctrl+C, add

    final KeyCodeCombination keyCodeCopy = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY);
    table.setOnKeyPressed(event -> {
        if (keyCodeCopy.match(event)) {
            copySelectionToClipboard(table);
        }
    });
like image 44
warakawa Avatar answered Nov 16 '22 20:11

warakawa


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);
like image 16
yelliver Avatar answered Nov 16 '22 18:11

yelliver