SWT:将可点击 link 集成到 StyledText 中

SWT: Integrate clickable link into StyledText

this question 的帮助下,我能够弄清楚如何在 SwT 中的 StyledText 小部件内显示 link。颜色正确,鼠标悬停在 link 上时甚至会改变形状。

到目前为止一切顺利,但 link 实际上不可点击。虽然光标改变了它的形状,但如果点击 link 则什么也不会发生。因此,我想问如何单击 link 以在浏览器中实际打开它。

我想到了使用 MouseListener,将点击位置跟踪回已执行点击的相应文本,然后决定是否打开 link。然而,这似乎太复杂了,因为已经有一些例程正在进行相应地更改光标。我相信有一些简单的方法可以做到这一点(并确保点击行为实际上与光标改变形状时的行为一致)。

有人有什么建议吗?

这是一个 MWE,展示了我到目前为止所做的事情:

public static void main(String[] args) throws MalformedURLException {
final URL testURL = new URL("");

Display display = new Display();

Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, true));

StyledText sTextWidget = new StyledText(shell, SWT.READ_ONLY);

final String firstPart = "Some text before ";
String msg = firstPart + testURL.toString() + " some text after";

sTextWidget.setText(msg);
sTextWidget.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

StyleRange linkStyleRange = new StyleRange(firstPart.length(), testURL.toString().length(), null, null);
linkStyleRange.underline = true;
linkStyleRange.underlineStyle = SWT.UNDERLINE_LINK;
linkStyleRange.data = testURL.toString();

sTextWidget.setStyleRange(linkStyleRange);

shell.open();

while(!shell.isDisposed()) {
    display.readAndDispatch();
}
}

好吧,我发布这个问题的速度有点太快了......有一个片段正好解决了这个问题,它表明,确实必须使用额外的 MouseListener 才能得到事情正常。

可以找到该片段 here,这是设置侦听器的相关部分:

styledText.addListener(SWT.MouseDown, 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) {
        int offset = styledText.getOffsetAtLocation(new Point (event.x, event.y));
        if (offset != -1) {
            StyleRange style1 = null;
            try {
                style1 = styledText.getStyleRangeAtOffset(offset);
            } catch (IllegalArgumentException e) {
                // no character under event.x, event.y
            }
            if (style1 != null && style1.underline && style1.underlineStyle == SWT.UNDERLINE_LINK) {
                System.out.println("Click on a Link");
            }
        }
    }
});