启用跨不同应用程序的复制/粘贴

时间:2014-06-13 06:31:14

标签: java textbox swt clipboard copy-paste

Windows中SWT Text的默认上下文菜单有几个我们不想要的选项。由于默认上下文菜单由操作系统提供且无法修改,因此我创建了一个自定义上下文菜单,其中仅包含基本文本操作,如文本框的删除,剪切,复制和粘贴。

Custom Text context Menu

现在的问题是,当我从另一个应用程序复制文本并尝试粘贴到TextBox时,粘贴似乎不起作用。但是当我们在应用程序本身内复制/剪切文本时,它就有效。

以下是复制和粘贴的代码。 粘贴动作:

private class PasteActionHandler extends Action {

    /** Creates a new instance. */
    private PasteActionHandler() {
        ...
        setEnabled(false);
    }

    @Override
    public void runWithEvent(Event event) {
        if (activeTextControl != null && !activeTextControl.isDisposed()) {
            activeTextControl.paste();
            updateActionsEnableState();
            return;
        }
    }

    /**
     * Updates the state of the Paste Action.
     */
    public void updateEnabledState() {
        if (activeTextControl != null && !activeTextControl.isDisposed()) {
            boolean canPaste = false;
            if (activeTextControl.getEditable()) {
                Clipboard clipboard = new Clipboard(activeTextControl.getDisplay());
                TransferData[] td = clipboard.getAvailableTypes();
                for (int i = 0; i < td.length; ++i) {
                    if (TextTransfer.getInstance().isSupportedType(td[i])) {
                        canPaste = true;
                        break;
                    }
                }
                clipboard.dispose();
            }
            setEnabled(canPaste);
            return;
        }
        setEnabled(false);
    }
}

复制动作:

private class CopyActionHandler extends Action {

    private CopyActionHandler() {
        ...
        setEnabled(false);
    }

    @Override
    public void runWithEvent(Event event) {
        if (activeTextControl != null && !activeTextControl.isDisposed()) {
            activeTextControl.copy();
            updateActionsEnableState();
            return;
        }
    }

    /**
     * Updates the state of the {@link Action}.
     */
    public void updateEnabledState() {
        if (activeTextControl != null && !activeTextControl.isDisposed()) {
            setEnabled(activeTextControl.getSelectionCount() > 0);
            return;
        }
        setEnabled(false);
    }
}

如您所见,我调用Text控件的复制和粘贴功能来执行操作。 在SWT中还有一种获取系统剪贴板的方法吗?

1 个答案:

答案 0 :(得分:0)

要从SWT复制剪贴板中的内容,请使用以下代码:

    String textData = textControl.getText();
    if (textData.length() > 0) {
      org.eclipse.swt.dnd.Clipboard cb = new org.eclipse.swt.dnd.Clipboard(display);
      org.eclipse.swt.dnd.TextTransfer textTransfer = org.eclipse.swt.dnd.TextTransfer.getInstance();
      cb.setContents(new Object[]{textData}, new Transfer[]{textTransfer});
    }

你可以试试而不是activeTextControl.copy()功能,看它是否有效