【问题标题】:SWT Link flickers with gradient backgroundSWT Link 以渐变背景闪烁
【发布时间】:2010-09-14 20:19:10
【问题描述】:

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

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

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

有没有办法修复链接上的闪烁效果,或者是否有其他组件可以支持链接?

谢谢,

布赖恩

【问题讨论】:

    标签: java eclipse user-interface swt widget


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您是否尝试过将 SWT.NO_BACKGROUND 传递给您的链接小部件?它可能会有点奇怪......你可能需要做更多的工作才能正确绘制 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();
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多