ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – JTable:覆盖CTRL C行为

2019-06-21 02:51:18  阅读:221  来源: 互联网

标签:java swing jtable


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

目前,我已在其构造函数中向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) – 适合目标操作系统的键绑定 – 然后自动连线

标签:java,swing,jtable
来源: https://codeday.me/bug/20190621/1250903.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有