Подсказка SWT/JFace для элемента управления текстом, когда текст в элементе управления слишком велик для отображения

Я знаю, что это можно реализовать довольно легко, но для этого я должен использовать стандартную функциональность. Мне нужно, чтобы всплывающая подсказка отображалась в текстовом поле, но только тогда, когда текст в текстовом поле слишком длинный для отображения в поле. Таблицы и деревья имеют эту функцию при изменении размера столбцов, но я не нашел ничего подобного для текстовых полей.

Мне не удалось найти эту функцию и в Eclipse, поэтому я предполагаю, что это не стандартная функция. Пожалуйста, докажите, что я не прав :).

Заранее спасибо.


person Lori    schedule 01.02.2012    source источник


Ответы (1)


Что значит "Стандартная функциональность"?..? Добавление экземпляра modifyListener к экземпляру Text является (imo) стандартным достаточно справедливым.

Вот мой подход

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;


public class TextLabel {
    public TextLabel() {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout());
        shell.setSize(200, 150);
        shell.setText("Long Text content label");

        Text txtLong = new Text(shell, SWT.SINGLE | SWT.BORDER);
        txtLong.addModifyListener(new ModifyListener() {

            @Override
            public void modifyText(ModifyEvent e) {
                Text txtSource = (Text) e.getSource();
                Point size = (new GC(txtSource)).stringExtent(txtSource.getText());
                if(size.x > txtSource.getBounds().width - txtSource.getBorderWidth()) txtSource.setToolTipText(txtSource.getText());
                else txtSource.setToolTipText(null);
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    public static void main(String args[]) {
        new TextLabel();
    }
}
person Sorceror    schedule 02.02.2012
comment
Привет, стандартная функциональность означает «из коробки», точно так же, как у таблиц и деревьев. Я подумал, может быть, он реализован из коробки, и мне просто нужно его активировать или что-то в этом роде. Однако ваш код правильный и работает. - person Lori; 03.02.2012
comment
По сути, если вы построите таблицу или дерево, измените размер одного столбца, чтобы текст больше не помещался, вы увидите, что компоненты предлагают эту функциональность из коробки. - person Lori; 03.02.2012
comment
Вы можете быть правы, у меня есть только окна, поэтому я не могу это проверить. - person Lori; 03.02.2012