JTable右键单击复制/粘贴菜单以一键复制单元格数据

Stevetronix

我创建了我的JPopupMenuJTable当我右键单击一个单元格时,它会显示在我的身上。但是,除非先双击然后突出显示数据,然后右键单击该当前单元格以外的任何位置以显示我的弹出菜单和复制选项,否则我无法复制该单元格中的数据。

我想在单元格中复制数据,而无需双击单元格并进入单元格编辑模式,然后我需要选择数据。

我怎样才能做到这一点?

popup = new JPopupMenu();
popup.setName("popupMenu");
menuItemCopy = new JMenuItem(new DefaultEditorKit.CopyAction());
menuItemCopy.setText("Copy");
menuItemCopy.setName("copy");       
popup.add(menuItemCopy);
popup.addSeparator();
menuItemPaste = new JMenuItem(new DefaultEditorKit.PasteAction());
menuItemPaste.setText("Paste");
menuItemPaste.setName("paste");
popup.add(menuItemPaste);

这是我MouseListenerJTableinmouseReleased()in编写的代码mousePressed()

if(e.isPopupTrigger())
{
    JTable source = (JTable)e.getSource();
    int row = source.rowAtPoint( e.getPoint() );
    int column = source.columnAtPoint( e.getPoint() );

    gridView.popup.show(e.getComponent(), e.getX(), e.getY());              
}
疯狂程序员

两件事情...

  1. 我不知道你是如何想到DefaultEditorKit.CopyActionDefaultEditorKit.PasteAction与工作JTable,这些假设与使用JTextComponents...
  2. JTable会只强调在左键按下(或键盘导航的变化)的行,鼠标右键单击默认情况下不这样做。

现在,我想使用JTable的组件弹出窗口支持,但是一旦检测到弹出窗口触发,这似乎会消耗掉所有鼠标事件,这使得(几乎)不可能右键单击来突出显示行/列。

相反,我最终在自己的highlight方法中添加了一个方法,该方法MouseListener突出显示有问题的行/列,然后触发弹出窗口。

我这样做的原因是,Action与复制和粘贴相关联的与表无关,因此没有其他概念,因此他们不知道单击了什么行/列。

这使这些操作可以集中于仅担心选择。

内容通过自定义可传输文件直接复制到系统剪贴板,该文件可保留单元格的原始类型,这意味着粘贴对象时无需重建对象。

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.FlavorEvent;
import java.awt.datatransfer.FlavorListener;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import static javax.swing.Action.NAME;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TestTable100 {

    public static void main(String[] args) {
        new TestTable100();
    }

    public TestTable100() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel();
                model.addColumn("Type");
                model.addColumn("Column");
                for (File file : new File(System.getProperty("user.home")).listFiles()) {
                    model.addRow(new Object[]{file, file});
                }

                JTable table = new JTable(model);
                table.getColumnModel().getColumn(0).setCellRenderer(new FirstCellRenderer());

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                final JPopupMenu pm = new JPopupMenu();
                pm.add(new CopyAction(table));
                pm.add(new PasteAction(table));

                table.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        if (e.isPopupTrigger()) {
                            highlightRow(e);
                            doPopup(e);
                        }
                    }

                    @Override
                    public void mouseReleased(MouseEvent e) {
                        if (e.isPopupTrigger()) {
                            highlightRow(e);
                            doPopup(e);
                        }
                    }

                    protected void doPopup(MouseEvent e) {
                        pm.show(e.getComponent(), e.getX(), e.getY());
                    }

                    protected void highlightRow(MouseEvent e) {
                        JTable table = (JTable) e.getSource();
                        Point point = e.getPoint();
                        int row = table.rowAtPoint(point);
                        int col = table.columnAtPoint(point);

                        table.setRowSelectionInterval(row, row);
                        table.setColumnSelectionInterval(col, col);
                    }

                });
            }
        });
    }

    public class FirstCellRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) {

            File f = (File) value;

            super.getTableCellRendererComponent(table,
                            value, isSelected, hasFocus, row, column);
            String prefix = f.isDirectory() ? "DIR" : "FILE";
            setText(prefix);

            return this;
        }
    }

    public class CopyAction extends AbstractAction {

        private JTable table;

        public CopyAction(JTable table) {
            this.table = table;
            putValue(NAME, "Copy");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int row = table.getSelectedRow();
            int col = table.getSelectedColumn();

            Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
            cb.setContents(new CellTransferable(table.getValueAt(row, col)), null);
        }

    }

    public class PasteAction extends AbstractAction {

        private JTable table;

        public PasteAction(JTable table) {
            this.table = table;
            putValue(NAME, "Paste");
            final Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
            cb.addFlavorListener(new FlavorListener() {
                @Override
                public void flavorsChanged(FlavorEvent e) {
                    setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));
                }
            });
            setEnabled(cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            int row = table.getSelectedRow();
            int col = table.getSelectedColumn();

            Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
            if (cb.isDataFlavorAvailable(CellTransferable.CELL_DATA_FLAVOR)) {
                try {
                    Object value = cb.getData(CellTransferable.CELL_DATA_FLAVOR);
                    table.setValueAt(value, row, col);
                } catch (UnsupportedFlavorException | IOException ex) {
                    ex.printStackTrace();
                }
            }
        }

    }

    public static class CellTransferable implements Transferable {

        public static final DataFlavor CELL_DATA_FLAVOR = new DataFlavor(Object.class, "application/x-cell-value");

        private Object cellValue;

        public CellTransferable(Object cellValue) {
            this.cellValue = cellValue;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[]{CELL_DATA_FLAVOR};
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return CELL_DATA_FLAVOR.equals(flavor);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            if (!isDataFlavorSupported(flavor)) {
                throw new UnsupportedFlavorException(flavor);
            }
            return cellValue;
        }

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用空白中间单元格复制粘贴整行

复制单元格数据并粘贴到变量中(pasteSpecial)

复制粘贴的单元格每粘贴4个单元格就会更改列

Excel VBA宏复制单元格并粘贴到另一个

如何复制粘贴单元格值,如果单元格包含大于 0,则通过循环粘贴到另一个单元格

复制单元格包含多个数据的行

循环和复制单元格

需要基于单元格值添加行,并从上方复制粘贴数据并将其转置

从范围复制单元格值并将其粘贴到另一个工作表的单行中

使用右键单击上下文菜单剪切粘贴或复制粘贴在 Ubuntu 20.04 上不起作用

如何基于下拉菜单将表数据复制/粘贴到不同的单元格中?

复制单元格背景色并将其粘贴到另一张纸的相应单元格中

VBA-复制单元格并将其粘贴到另一张纸上的空白单元格中

双击复制单元格,然后自动粘贴到另一张纸上的其他单元格中

VBA Excel-复制单元格值并将值粘贴在另一个单元格的字符之间

VBA:复制单元格,粘贴为图片,然后另存为图片?

从多个文件复制单元格J1并粘贴到主文件的列中

VBA-从A和B列复制单元格并粘贴到新表中

从多个Excel文件复制单元格并将其粘贴到主文件中

根据条件复制单元格并通过覆盖其他工作表中的单元格进行粘贴

通过范围单元格进行复制粘贴:Excel VBA

如果单元格在 excel 中具有红色/绿色/黄色,则复制粘贴整行

在QTableWidget单元格PyQt5中的标签中复制粘贴文本

复制粘贴取决于两个区域中的单元格值

Microsoft Excel-在保留对单个单元格的引用的同时复制粘贴

使用 VBA 从两个不同的工作表复制粘贴单元格

在两个不同的工作簿之间的错误单元格区域中复制粘贴

根据单元格内容复制粘贴图表的宏

由于合并的单元格,复制粘贴导致的错误范围