You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Eclipse RCP中调用系统复制粘贴功能适配NatTable场景?

解决NatTable编辑模式下部分文本选中时的系统复制触发问题

核心思路

在自定义MyCopyHandler中区分两种场景:

  • 当有一个/多个单元格被选中时,执行自定义复制逻辑
  • 当单元格处于编辑模式且仅选中内部部分文本时,触发操作系统的复制机制

同时将canExecute方法返回true,确保剪切/复制/粘贴工具项始终处于启用状态。

实现方案

1. 判断场景并触发系统复制

可以通过两种方式实现系统复制的调用:

方式一:直接操作SWT剪切板

获取编辑器内选中的文本,直接写入系统剪切板:

// 获取当前激活的单元格编辑器
ICellEditor activeEditor = natTable.getActiveCellEditor();
if (activeEditor != null && activeEditor.isActive()) {
    Control editorControl = activeEditor.getEditorControl();
    if (editorControl instanceof Text) {
        Text textControl = (Text) editorControl;
        String selectedText = textControl.getSelectionText();
        if (!selectedText.isEmpty()) {
            // 操作系统剪切板
            Clipboard clipboard = new Clipboard(Display.getDefault());
            try {
                clipboard.setContents(
                    new Object[]{selectedText},
                    new Transfer[]{TextTransfer.getInstance()}
                );
            } finally {
                clipboard.dispose();
            }
            return;
        }
    }
}
方式二:调用Eclipse内置系统复制命令

直接触发Eclipse原生的复制命令,复用系统剪切板逻辑:

IHandlerService handlerService = PlatformUI.getWorkbench().getService(IHandlerService.class);
try {
    handlerService.executeCommand(IWorkbenchCommandConstants.EDIT_COPY, null);
} catch (Exception e) {
    e.printStackTrace();
}

2. 完整的MyCopyHandler示例

@Creatable
@TargetCommand(IWorkbenchCommandConstants.EDIT_COPY)
public class MyCopyHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        NatTable natTable = getCurrentNatTable(event);
        if (natTable == null) return null;

        // 场景1:有单元格选中,执行自定义复制逻辑
        ISelectionModel selectionModel = natTable.getSelectionModel();
        if (!selectionModel.getSelectedCells().isEmpty()) {
            customCellCopy(natTable);
            return null;
        }

        // 场景2:编辑模式下选中部分文本,触发系统复制
        ICellEditor activeEditor = natTable.getActiveCellEditor();
        if (activeEditor != null && activeEditor.isActive()) {
            Control editorControl = activeEditor.getEditorControl();
            if (editorControl instanceof Text) {
                Text textControl = (Text) editorControl;
                String selectedText = textControl.getSelectionText();
                if (!selectedText.isEmpty()) {
                    Clipboard clipboard = new Clipboard(Display.getDefault());
                    try {
                        clipboard.setContents(
                            new Object[]{selectedText},
                            new Transfer[]{TextTransfer.getInstance()}
                        );
                    } finally {
                        clipboard.dispose();
                    }
                    return null;
                }
            }
        }

        // Fallback:执行系统默认复制
        IHandlerService handlerService = PlatformUI.getWorkbench().getService(IHandlerService.class);
        try {
            handlerService.executeCommand(IWorkbenchCommandConstants.EDIT_COPY, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public boolean canExecute(Object evaluationContext) {
        // 始终返回true,确保工具项不被禁用
        return true;
    }

    // 根据实际场景获取当前NatTable实例
    private NatTable getCurrentNatTable(ExecutionEvent event) {
        IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
        if (activePart instanceof NatTableContainerPart) {
            return ((NatTableContainerPart) activePart).getNatTable();
        }
        return null;
    }

    // 自定义单元格复制逻辑
    private void customCellCopy(NatTable natTable) {
        natTable.doCommand(new CopyDataCommand(natTable.getConfigRegistry()));
    }
}

关键注意点

  • canExecute返回true是核心,避免工具项因命令不可用被禁用
  • 优先处理单元格选中场景,再判断编辑模式下的文本选中情况
  • 操作SWT剪切板后必须调用dispose()释放资源

内容的提问来源于stack exchange,提问作者Sadık

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:05:27