gpt4 book ai didi

java - JTable:覆盖 CTRL+C 行为

转载 作者:搜寻专家 更新时间:2023-11-01 02:30:57 27 4
gpt4 key购买 nike

我将 JTable 设置为 SINGLE_SELECTION 模式,即用户一次只能选择一行。我正在尝试覆盖 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)——适用于目标操作系统的键绑定(bind)——然后自动连接

关于java - JTable:覆盖 CTRL+C 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9484407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com