1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

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);
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java javafx ou faça a sua própria pergunta.