SWT Link мерцает с градиентным фоном - PullRequest
1 голос
/ 02 октября 2008

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

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

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

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

Спасибо

Brian

Ответы [ 2 ]

1 голос
/ 31 октября 2008

Вы пытались передать 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();
   }
}
1 голос
/ 03 октября 2008

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

...