Saltar al contenido

cómo copiar el contenido de jtable al portapapeles

Solución:

Cuando necesitaba hacer esto en el pasado, comencé con el código aquí: http://www.javaworld.com/javatips/jw-javatip77.html

Y modificado para crear una acción para un botón que copiaría los datos y los encabezados de columna de una tabla al portapapeles.

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.StringTokenizer;




/**
 * ExcelAdapter enables Copy-Paste Clipboard functionality on JTables. The clipboard data format used by the adapter is
 * compatible with the clipboard format used by Excel. This provides for clipboard interoperability between enabled
 * JTables and Excel.
 */
public class ExcelAdapter implements ActionListener 


    private String rowstring, value;
    private Clipboard clipboard;
    private StringSelection stsel;
    private JTable jTable1;


    /**
     * The Excel Adapter is constructed with a JTable on which it enables Copy-Paste and acts as a Clipboard listener.
     */
    public ExcelAdapter(JTable myJTable) 

        jTable1 = myJTable;
        final KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK, false);
        // Identifying the copy KeyStroke user can modify this
        // to copy on some other Key combination.
        final KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK, false);
        // Identifying the Paste KeyStroke user can modify this
        //to copy on some other Key combination.
        jTable1.registerKeyboardAction(this, "Copy", copy, JComponent.WHEN_FOCUSED);
        jTable1.registerKeyboardAction(this, "Paste", paste, JComponent.WHEN_FOCUSED);
        clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    


    /**
     * Public Accessor methods for the Table on which this adapter acts.
     */
    public JTable getJTable() 

        return jTable1;
    


    public void setJTable(JTable jTable1) 

        this.jTable1 = jTable1;
    


    /**
     * This method is activated on the Keystrokes we are listening to in this implementation. Here it listens for Copy
     * and Paste ActionCommands. Selections comprising non-adjacent cells result in invalid selection and then copy
     * action cannot be performed. Paste is done by aligning the upper left corner of the selection with the 1st element
     * in the current selection of the JTable.
     */
    @Override
    public void actionPerformed(ActionEvent e) 

        final String actionCommand = e.getActionCommand();

        if (actionCommand.equals("Copy")) 

            StringBuilder sbf = new StringBuilder();
            // Check to ensure we have selected only a contiguous block of cells.
            final int numcols = jTable1.getSelectedColumnCount();
            final int numrows = jTable1.getSelectedRowCount();
            final int[] rowsselected = jTable1.getSelectedRows();
            final int[] colsselected = jTable1.getSelectedColumns();

            if (!((numrows - 1 == rowsselected[rowsselected.length - 1] - rowsselected[0] &&
                    numrows == rowsselected.length) &&
                    (numcols - 1 == colsselected[colsselected.length - 1] - colsselected[0] &&
                            numcols == colsselected.length))) 
                JOptionPane.showMessageDialog(null, "Invalid Copy Selection",
                                              "Invalid Copy Selection",
                                              JOptionPane.ERROR_MESSAGE);
                return;
            
            for (int i = 0; i < numrows; i++) 
                for (int j = 0; j < numcols; j++) 
                    sbf.append(jTable1.getValueAt(rowsselected[i], colsselected[j]));
                    if (j < numcols - 1) 
                        sbf.append('t');
                    
                
                sbf.append('n');
            
            stsel = new StringSelection(sbf.toString());
            clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            clipboard.setContents(stsel, stsel);

         else if (actionCommand.equals("Paste")) 

            System.out.println("Trying to Paste");
            final int startRow = (jTable1.getSelectedRows())[0];
            final int startCol = (jTable1.getSelectedColumns())[0];
            try 
                final String trString = (String) (clipboard.getContents(this).getTransferData(DataFlavor.stringFlavor));
                System.out.println("String is:" + trString);
                final StringTokenizer st1 = new StringTokenizer(trString, "n");
                for (int i = 0; st1.hasMoreTokens(); i++) 
                    rowstring = st1.nextToken();
                    StringTokenizer st2 = new StringTokenizer(rowstring, "t");
                    for (int j = 0; st2.hasMoreTokens(); j++) 
                        value = (String) st2.nextToken();
                        if (startRow + i < jTable1.getRowCount() &&
                                startCol + j < jTable1.getColumnCount()) 
                            jTable1.setValueAt(value, startRow + i, startCol + j);
                        
                        System.out.println("Putting " + value + "at row = " + startRow + i + " column = " + startCol + j);
                    
                
             catch (Exception ex) 
                ex.printStackTrace();
            

        

    


JTable ya admite una acción de copia. Action Map Action muestra cómo puede usar fácilmente esta acción con un JButton para que no tenga que volver a escribir el código.

Aquí hay una versión renovada de ExcelAdapter de javaworld (desde 1999). Enlace

Para usar:

jTable1.addKeyListener(new ClipboardKeyAdapter(jTable1));

ClipboardKeyAdapter.java

        public class ClipboardKeyAdapter extends KeyAdapter 

        private static final String LINE_BREAK = "r"; 
        private static final String CELL_BREAK = "t"; 
        private static final Clipboard CLIPBOARD = Toolkit.getDefaultToolkit().getSystemClipboard(); 

        private final JTable table; 

        public ClipboardKeyAdapter(JTable table)  
                this.table = table; 
         

        @Override 
        public void keyReleased(KeyEvent event)  
                if (event.isControlDown())  
                        if (event.getKeyCode()==KeyEvent.VK_C)  // Copy                        
                                cancelEditing(); 
                                copyToClipboard(false); 
                         else if (event.getKeyCode()==KeyEvent.VK_X)  // Cut 
                                cancelEditing(); 
                                copyToClipboard(true); 
                         else if (event.getKeyCode()==KeyEvent.VK_V)  // Paste 
                                cancelEditing(); 
                                pasteFromClipboard();           
                         
                 
         

        private void copyToClipboard(boolean isCut)  
                int numCols=table.getSelectedColumnCount(); 
                int numRows=table.getSelectedRowCount(); 
                int[] rowsSelected=table.getSelectedRows(); 
                int[] colsSelected=table.getSelectedColumns(); 
                if (numRows!=rowsSelected[rowsSelected.length-1]-rowsSelected[0]+1  

        private void pasteFromClipboard()  
                int startRow=table.getSelectedRows()[0]; 
                int startCol=table.getSelectedColumns()[0];

                String pasteString = ""; 
                try  
                        pasteString = (String)(CLIPBOARD.getContents(this).getTransferData(DataFlavor.stringFlavor)); 
                 catch (Exception e)  
                        JOptionPane.showMessageDialog(null, "Invalid Paste Type", "Invalid Paste Type", JOptionPane.ERROR_MESSAGE);
                        return; 
                

                String[] lines = pasteString.split(LINE_BREAK);

                for (int i=0 ; istartRow+i && table.getColumnCount()>startCol+j)  
                                        table.setValueAt(cells[j], startRow+i, startCol+j); 
                                 
                         
                 
         

        private void cancelEditing()  
                if (table.getCellEditor() != null)  
                        table.getCellEditor().cancelCellEditing(); 
             
         

        private String escape(Object cell)  
                return cell.toString().replace(LINE_BREAK, " ").replace(CELL_BREAK, " "); 
         

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *