1

我正在开发一个使用 SWT 接口的 Eclipse 插件。我需要显示文本,并且在该文本中需要有链接。我发现的唯一两个允许我在文本中包含可点击链接的小部件是链接和浏览器。然而,浏览器对我的需求来说太过分了,我无法正确自定义它的外观。这只留下链接小部件。

问题是我需要 Link 小部件从它所在的 Composite 继承渐变。只有在调整大小或滚动 Link 组件闪烁时,它才能正确执行此操作。Link 是我看到这种效果的唯一组件。

为了解决这个问题,我尝试将其他组件操作为具有可点击链接,但我还没有找到一个好的解决方案。

无论如何要修复链接上的闪烁效果,还是有不同的组件可以支持链接?

谢谢,

布赖恩

4

2 回答 2

1

在花了一天时间解决这个问题后,我想出了一个解决方法。我为文本区域创建了一个 Composite。对于不属于 url 的每个单词,都有自己的标签。对于链接,每个字母都有自己的标签。然后 url 字符的标签让监听器启动浏览器。使用此方法提供了链接功能,正确处理大小调整,并且没有闪烁。

于 2008-10-02T20:12:14.900 回答
1

您是否尝试过将 SWT.NO_BACKGROUND 传递给您的 Link 小部件?它可能会有点奇怪......你可能需要做更多的工作才能正确绘制 gui,但这是我的第一个猜测。

除此之外,这是我在 StyledText 内的链接的 Quick n'dirty 实现。您将需要填写以更改光标(如果这是您想要的),以及提出一个好的“文本链接”映射方案。

唯一的事情是我不确定 StyledText 是否会继承你的背景......试一试。

public class StyledTextExample {
   public static void main(String [] args) {
    // create the widget's shell
    Shell shell = new Shell();
    shell.setLayout(new FillLayout());
    shell.setSize(200, 100);
    Display display = shell.getDisplay();
    // create the styled text widget
    final StyledText widget = new StyledText(shell, SWT.NONE);

    String text = "This is the StyledText widget.";
    widget.setText(text);
    widget.setEditable(false);

    final StyleRange hyperlinkStyle = new StyleRange();
    String linkWord = "StyledText";
    hyperlinkStyle.start = text.indexOf(linkWord);
    hyperlinkStyle.length = linkWord.length();
    hyperlinkStyle.fontStyle = SWT.BOLD;
    hyperlinkStyle.foreground = display.getSystemColor(SWT.COLOR_BLUE);
    widget.setStyleRange(hyperlinkStyle);


    widget.addMouseListener(new MouseAdapter() {
        public void mouseUp(MouseEvent arg0) {
            Point clickPoint = new Point(arg0.x, arg0.y);
            try {
                int offset = widget.getOffsetAtLocation(clickPoint);
                if (widget.getStyleRangeAtOffset(offset) != null) {
                    System.out.println("link");
                }
            } catch (IllegalArgumentException e) {
                //ignore, clicked out of text range.
            }
        }});
    shell.open();
    while (!shell.isDisposed())
    if (!display.readAndDispatch()) display.sleep();
   }
}
于 2008-10-30T21:08:25.053 回答