Versão atual:

Habilitar copy/paste TableView (Funcionando) dúvida editar funcionalidade.

Galera, encontrei pela net essa classe que habilita Copy/Paste nas TableViews JavaFX. Funciona, porém não está muito legal para o que eu preciso.

Exemplo: O código copia célula por célula, mas para funcionar, você tem que habilitar:

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

Porém, após habilitar desta forma, ao clicar em alguma célula da TableView, a seleção fica só na célula, mas "para o meu uso", seria interessante já selecionar a ROW inteira. Alguém sabe se é possível mudar isto?

Explicando melhor, para o que eu quero, o ideal seria usar apenas:

TableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

Que me habilita seleção multipla de ROWS, clicando em qualquer célula, seleciona a ROW inteira. Porém ao utilizar o copy/paste no Excell, ele cola os campos apenas da célula que você clicou, mesmo aparecendo a ROW inteira selecionada.

Possível solução 1: Se desse pra deixar habilitado o setCellSelectionEnabled e o SelectionMode.MULTIPLE, e criar algum código que ao clicar em uma célula já selecionava sozinho toda a ROW, resolveria o problema, porque aí não necessitaria alterar a Classe do Copy/Paste, pois já pegaria os dados de todas as células da ROW.

Possível solução 2: Mudar o código na classe do Copy/Paste para copiar Row em vez de Cells. Eu tentei, mas não deu nada certo.

Se alguém achar que é possível e quiser dar uma luz ai, segue a classe do Copy/Paste a baixo.

PS: Caso não se incomode com este detalhe e queria habilitar o copy/paste do jeito que está, pode utilizar a vontade, pois está funcionando perfeitamente.

Classe Copy/Paste:

import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;

public class TableUtils {

    /**
     * Install the keyboard handler:
     *   + CTRL + C = copy to clipboard
     * @param table
     */
    public static void installCopyPasteHandler(TableView<?> table) {

        // install copy/paste keyboard handler
        table.setOnKeyPressed(new TableKeyEventHandler());

    }

    /**
     * Copy/Paste keyboard event handler.
     * The handler uses the keyEvent's source for the clipboard data. The source must be of type TableView.
     */
    public static class TableKeyEventHandler implements EventHandler<KeyEvent> {

        KeyCodeCombination copyKeyCodeCompination = new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY);

        public void handle(final KeyEvent keyEvent) {

            if (copyKeyCodeCompination.match(keyEvent)) {

                if( keyEvent.getSource() instanceof TableView) {

                    // copy to clipboard
                    copySelectionToClipboard( (TableView<?>) keyEvent.getSource());

                    System.out.println("Selection copied to clipboard");

                    // event is handled, consume it
                    keyEvent.consume();

                }

            }

        }

    }

    /**
     * Get table selection and copy it to the clipboard.
     * @param table
     */
    public static void copySelectionToClipboard(TableView<?> table) {

        StringBuilder clipboardString = new StringBuilder();

        ObservableList<TablePosition> positionList = table.getSelectionModel().getSelectedCells();

        int prevRow = -1;

        for (TablePosition position : positionList) {

            int row = position.getRow();
            int col = position.getColumn();

            Object cell = (Object) table.getColumns().get(col).getCellData(row);

            // null-check: provide empty string for nulls
            if (cell == null) {
                cell = "";
            }

            // determine whether we advance in a row (tab) or a column
            // (newline).
            if (prevRow == row) {

                clipboardString.append('\t');

            } else if (prevRow != -1) {

                clipboardString.append('\n');

            }

            // create string from cell
            String text = cell.toString();

            // add new item to clipboard
            clipboardString.append(text);

            // remember previous
            prevRow = row;
        }

        // create clipboard content
        final ClipboardContent clipboardContent = new ClipboardContent();
        clipboardContent.putString(clipboardString.toString());

        // set clipboard content
        Clipboard.getSystemClipboard().setContent(clipboardContent);
    }
}

Basta adicionar esta classe em seu projeto, importar na classe onde fica a TableView, e habilitar o método da forma que falei lá em cima, bastando apenas alterar o nome "TableView" para o nome que você deu para sua TableView:

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

Versões(3):

Ver a versão formatada

Habilitar copy/paste TableView (Funcionando) dúvida editar funcionalidade.

Comentário

new question