Вопрос

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

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

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

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

Спасибо,

Брайан

Это было полезно?

Решение

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

Другие советы

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

Кроме этого, вот моя быстрая и грязная реализация ссылки внутри 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();
   }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top