SWT Link мерцает с градиентным фоном

Я разрабатываю плагин eclipse, который использует интерфейс SWT. Мне нужно отобразить текст, и внутри этого текста должны быть ссылки. Единственные два виджета, которые я нашел, которые позволяют мне включать интерактивные ссылки в текст, — это «Ссылка» и «Браузер». Браузер, однако, является излишним для моих нужд, и я не мог должным образом настроить его внешний вид. Остается только виджет Link.

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

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

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

Спасибо,

Брайан


person Brian Gianforcaro    schedule 02.10.2008    source источник


Ответы (2)


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

person Brian Gianforcaro    schedule 02.10.2008

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

Кроме этого, вот моя быстрая и грязная реализация ссылки внутри 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();
   }
}
person James Van Huis    schedule 30.10.2008