Java 如何使SWT链接小部件中的文本可选择

Java 如何使SWT链接小部件中的文本可选择,java,hyperlink,swt,Java,Hyperlink,Swt,我在中创建了一个文本,如下所示: Link message = new Link(parent, SWT.WRAP); message.setText(myMessage); 我希望文本(在myMessage变量中)可以选择,以允许用户复制它。 我该怎么做 我使用了链接小部件,因为我需要文本中的超链接才能单击。SWTLink小部件不可选择。为了解决这个问题,我想 为链接提供一个上下文菜单,其中包含一个复制菜单项,用于将文本复制到剪贴板 在将文本复制到剪贴板的链接旁边放置一个复制(工具)按钮 使

我在中创建了一个文本,如下所示:

Link message = new Link(parent, SWT.WRAP);
message.setText(myMessage);
我希望文本(在
myMessage
变量中)可以选择,以允许用户复制它。 我该怎么做


我使用了链接小部件,因为我需要文本中的超链接才能单击。

SWT
Link
小部件不可选择。为了解决这个问题,我想

  • 链接提供一个上下文菜单,其中包含一个复制菜单项,用于将文本复制到剪贴板
  • 在将文本复制到剪贴板的
    链接旁边放置一个复制(工具)按钮
  • 使用
    浏览器
    小部件,该小部件是可选择的,但更难布局,并且在选择链接时需要额外的工作来触发功能
  • 如果您不介意额外依赖于
    org.eclipse.ui.forms
    ,请使用
    FormText
    FormText
    可以显示超链接,并允许选择和复制文本

  • 为什么不使用StyledText来允许文本选择

    String string = "This is sample text with a link and some other link here.";
    final StyledText styledText = new StyledText (shell, SWT.MULTI | SWT.BORDER);
    styledText.setText(string);
    
    String link1 = "link";
    String link2 = "here";
    StyleRange style = new StyleRange();
    style.underline = true;
    style.underlineStyle = SWT.UNDERLINE_LINK;
    
    int[] ranges = {string.indexOf(link1), link1.length(), string.indexOf(link2), link2.length()}; 
    StyleRange[] styles = {style, style};
    styledText.setStyleRanges(ranges, styles);
    
    styledText.addListener(SWT.MouseDown, new Listener() {
        @Override
        public void handleEvent(Event event) {
            // It is up to the application to determine when and how a link should be activated.
            // In this snippet links are activated on mouse down when the control key is held down 
            if ((event.stateMask & SWT.MOD1) != 0) {
                try {
                    int offset = styledText.getOffsetAtLocation(new Point (event.x, event.y));
                    StyleRange style = styledText.getStyleRangeAtOffset(offset);
                    if (style != null && style.underline && style.underlineStyle == SWT.UNDERLINE_LINK) {
                        System.out.println("Click on a Link");
                    }
                } catch (IllegalArgumentException e) {
                    // no character under event.x, event.y
                }
    
            }
        }
    });
    

    完整示例

    我看你对SO还不熟悉。如果您觉得有答案解决了问题,请单击绿色复选标记将其标记为“已接受”。这有助于保持对仍然没有答案的旧帖子的关注。这个小部件的用途超出了我的理解。。。