JTable:覆盖CTRL+C行为



我在SINGLE_SELECTION模式下设置了一个JTable,即用户一次只能选择一行。我正在尝试覆盖CTRL+CKeyListener,以便它将整个表复制到剪贴板。

目前,我已经在JTable的构造函数中为其本身添加了一个KeyListener

public MyTable(AbstractTableModel model) {
    super(model);
    getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    addKeyListener(new ExcelClipboardKeyAdapter(this));
}

KeyListener如下所示:

public class ExcelClipboardKeyAdapter extends KeyAdapter {
    private static final String LINE_BREAK = System.lineSeparator();
    private static final String CELL_BREAK = "t";
    private static final Clipboard CLIPBOARD = Toolkit.getDefaultToolkit().getSystemClipboard();
    private final JTable table;
    public ExcelClipboardKeyAdapter(JTable table) {
        this.table = table;
    }
    @Override
    public void keyReleased(KeyEvent event) {
        if (event.isControlDown()) {
            if (event.getKeyCode() == KeyEvent.VK_C) { // Copy                        
                copyToClipboard();
                System.out.println("here");
            }
        }
    }
    private void copyToClipboard() {
        int numCols = table.getColumnCount();
        int numRows = table.getRowCount();
        StringBuilder excelStr = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j < numCols; j++) {
                excelStr.append(escape(table.getValueAt(i, j)));
                if (j < numCols - 1) {
                    excelStr.append(CELL_BREAK);
                }
            }
            excelStr.append(LINE_BREAK);
        }
        StringSelection sel = new StringSelection(excelStr.toString());
        CLIPBOARD.setContents(sel, sel);
    }
    private String escape(Object cell) {
        return (cell == null? "" : cell.toString().replace(LINE_BREAK, " ").replace(CELL_BREAK, " "));
    }
}

但是,当我按下CTRL+C时,keyreleased方法不会被调用,也不会打印"here"。剪贴板的内容仅包含选定的行。

欢迎提出任何想法。

编辑

事实上,它有时会工作几次,然后停止工作,再次复制一行。。。奇怪的

将我的评论转化为答案:

实现一个自定义的TransferHandler,它创建"excel-transferable"并在表中使用它(使用dragEnabled==true)-适用于目标操作系统的密钥绑定-然后自动连接

1)使用KeyBundings,而不是KeyListener,因为Focus和setFosusable 没有任何问题

2) 你能解释一下为什么你需要用这种方式来确定SystemClipboard吗,也许还有另一种方式

最新更新