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");
}
}
}
});
在 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");
}
}
}
});