文本小部件的 SWT 拖放支持

Posted

技术标签:

【中文标题】文本小部件的 SWT 拖放支持【英文标题】:SWT Drag and Drop support for Text widget 【发布时间】:2010-10-29 05:12:23 【问题描述】:

我最近使用 SWT 编写了一个应用程序。在其中一个对话框中,我有一些小部件,其中之一是 Text,它旨在支持 DND 与其他小部件。我首先在同一个对话框(拖动源和放置目标)上添加了对 2 树小部件的 DND 支持。在我为那个 Text 小部件添加 DND 支持之前,我注意到在 Linux 平台 (gtk) 上,SWT Text 小部件自动获得拖放支持。也就是说,我已经可以从其他 Tree 小部件拖放到该 Text 上(在任何插入位置),以及从该 Text 中选择任何文本并将其拖动到其他 Tree 或 Text 小部件。

但是,这仅适用于 Linux 平台,不适用于 Windows。同一个程序,如果在 Windows 上运行,则不会对该文本小部件提供任何 DND 支持(树小部件当然支持 DND,因为我专门为它们编写)。

这也是我想在 Windows 上实现的目标:

    在文本小部件中的任意位置放置文本。 在下降之前和悬停时,能够清楚地看到插入符号的位置,即预期下降的位置。插入符号位置应随鼠标光标移动。 文本小部件支持多行

解决方案:

DropTarget target = new DropTarget(sytledText, DND.DROP_MOVE | DND.DROP_COPY);
target.setTransfer(new Transfer[]  TextTransfer.getInstance() );
target.addDropListener(new StyleTextDropTargetEffect(sytledText));
    使用 StyledText 代替 Text 小部件 使用 StyledTextDropTargetEffect(或扩展它)并将其添加为拖放侦听器

【问题讨论】:

好吧,我确实弄脏了我的手,并为自己创造了一个。但是,我无法解决滚动位置的问题。事实证明,StyledText 已经有了 StyledTextDropTargetEffect 类的这种支持。直到 Csaba_H 提出来我才注意到它。谢谢! 【参考方案1】:
    & 在 Windows 中的 AFAIK 中,使用文本小部件无法轻松做到这一点。在放置时,您可以在最后一个光标位置或文本末尾插入文本。您可以考虑使用 StyledText 小部件,该小部件支持在任何位置放置以及“插入符号悬停”。 Text 和 StyledText 都支持 SWT.MULTI 多行样式。

您可以在SWT snippets 页面找到许多很棒的代码 sn-ps,包括使用 StyledText 小部件进行拖放的示例。还有一个很好的介绍DND in SWT。

【讨论】:

StyledText 的主要优点是#insert(String) 方法将给定的字符串设置为当前选定的文本/鼠标位置。文本小部件没有这样的方法。 (写这个是因为我首先想知道 StyledText 的好处是什么)。你回答是为了走上正确的道路。

以上是关于文本小部件的 SWT 拖放支持的主要内容,如果未能解决你的问题,请参考以下文章

如何拖放自定义小部件?

SWT 独立滚动条小部件

org.eclipse.swt.SWTException:尝试打开 AndroidManifest.xml 时出现“小部件已释放”

如何使用自定义项目小部件拖放 QListWidget 项目?

在 QListWidget 之间拖放自定义小部件项目

Flutter:在屏幕上拖动小部件(不是拖放)