2008-10-02 2 views
1

Я разрабатываю плагин eclipse, в котором используется SWT-интерфейс. Мне нужно отобразить текст, и внутри этого текста должны быть ссылки. Единственные два виджета, которые я нашел, которые позволят мне включать интерактивные ссылки в тексте, - это Link and Browser. Браузер, однако, слишком переполнен для моих нужд, и я не мог правильно настроить его внешний вид. Это оставляет только виджет Link.SWT Link мерцает с градиентным фоном

Проблема заключается в том, что мне нужен виджет Link, чтобы наследовать градиент из Composite, в котором он находится. Он делает это правильно, только когда он изменен или прокручивается, компонент Link мерцает. Ссылка является единственным компонентом, в котором я видел этот эффект.

В попытке исправить это я пробовал манипулировать другими компонентами с помощью интерактивных ссылок, но пока не нашел хорошего решения.

Есть ли способ устранить мерцающий эффект на Link, или есть другой компонент, который поддерживает ссылки?

Спасибо,

Brian

ответ

1

Проведя день работая над этим, я придумал обходной путь. Я создал Composite для текстовой области. Для каждого слова, которое не является частью URL-адреса, получил свой собственный ярлык. Для ссылок каждое письмо имеет собственный ярлык. Затем метки для символов url получили прослушиватель для запуска браузера. Используя этот метод, предоставляя функциональность Link, правильно отрегулируйте размер и не мерцайте.

1

Вы пробовали передать SWT.NO_BACKGROUND вашему виджету Link? Это может показаться немного странным ... и вам, возможно, придется немного поработать, чтобы правильно рисовать gui, но это было бы моим первым предположением.

Кроме этого, вот моя быстрая 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(); 
    } 
} 
Смежные вопросы