自定义剪贴板数据

时间:2014-02-21 16:54:32

标签: java swt clipboard paste masking

如何将剪贴板信息存储为以非标准,自定义方式表示的数据?

我的公司有一个定制的SWT控件,用于创建带有蒙版的文本框,允许用户填写电话号码等提示:

example1

example2

当复制来自此控件的数据时,我想要一种方法,即后续的数据粘贴因上下文而异。例如,如果将上下文复制并粘贴到文本文件中,我希望包含蒙版字符。但是,如果它被粘贴到我们系统中的其他某些控件中,我希望它只粘贴非掩码字符。由于任何任意字符都可以用于掩码控件中的掩码字符,因此接收粘贴的控件不可能解析粘贴的结果。因此,我认为实现此目的的唯一方法是自定义复制数据存储在剪贴板中的方式。这有道理吗?

1 个答案:

答案 0 :(得分:3)

如果您使用Text控件的自定义版本并覆盖copy()方法,则可以使用自己的代码复制到Clipboard对象。剪贴板中的数据格式由您使用的Transfer对象控制。您可以提供多个不同的Transfer对象和数据:

Clipboard clipboard = new Clipboard(display);

String maskedData = "*******";
String unmaskedData = "password";

TextTransfer textTransfer = TextTransfer.getInstance();
UnmaskedTransfer umaskedTransfer = UnmaskedTransfer.getInstance();

Transfer [] transfers = new Transfer [] {textTransfer, umaskedTransfer};
Object [] data = new Object [] {maskedData, unmaskedData};

clipboard.setContents(data, transfers);

clipboard.dispose();

UnmaskedTransfer是您自己的Transfer实现,其中包含未屏蔽的密码。系统中需要获取未屏蔽文本的控件可以使用该Transfer对象向剪贴板请求数据(这假设这些控件在您的代码中并且可以自定义以执行此操作)。

不了解特殊Transfer对象的控件将使用TextTransfer并接收屏蔽密码。

自定义Text控件可能如下所示:

public class CustomText extends Text
{
  public CustomText(final Composite parent, final int style)
  {
    super(parent, style);
  }

  @Override
  public void copy()
  {
    // TODO your copy code
  }

  @Override
  public void paste()
  {
    // TODO your paste code
  }

  @Override
  protected void checkSubclass()
  {
    // Don't call super to stop subclassing exception
  }
}