2008-10-02 116 views
1

我正在开发一个使用SWT接口的eclipse插件。我需要显示文本,并在该文本中需要链接。我发现的唯一两个小部件将允许我在文本中包含可点击的链接,即链接和浏览器。然而,浏览器对于我的需求来说是过度的,我无法正确定制它的外观。这只会留下Link小部件。SWT链接闪烁渐变背景

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

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

有没有办法修复链接上的闪烁效果,还是有不同的组件支持链接?

感谢,

布赖恩

回答

1

度过一天这方面的工作后,我想出了一个解决方法。我为文本区域创建了一个Composite。对于不是网址一部分的每个单词,都有自己的标签。对于链接,每封信都有自己的标签。然后,url字符的标签就有了一个侦听器来启动浏览器。使用此方法提供了链接功能,正确处理了调整大小,并且没有闪烁。

1

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

除此之外,这里是我的Quick n'在StyledText中的一个链接的脏实现。你需要填写改变光标(如果这是你想要的东西),以及提出一个很好的“文本到链接”映射方案。

唯一的是我不确定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(); 
    } 
}