SWT链接随着渐变背景闪烁

时间:2020-03-06 15:02:00  来源:igfitidea点击:

我正在开发一个使用SWT接口的eclipse插件。我需要显示文本,并且该文本内需要链接。我发现仅有的两个可让我在文本中包含可点击链接的小部件是"链接"和"浏览器"。但是,浏览器对于我的需求而言过于矫kill过正,而且我无法正确自定义其外观。这仅留下链接窗口小部件。

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

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

无论如何,是否可以解决链接上的闪烁效果,或者是否有其他组件可以支持链接?

谢谢,

布赖恩

解决方案

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

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

除此之外,这是我在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();
   }
}