Текстовый виджет с саморегулирующейся высотой на основе интерактивно введенного текста? - PullRequest
3 голосов
/ 27 ноября 2011

Используя SWT и Java, у меня есть определенный текстовый виджет, который настроен для многострочных и переносных свойств. Я добавил слушателя, который будет отслеживать любые изменения в тексте внутри этого текстового виджета, и я хочу, чтобы высота виджета автоматически изменялась, если пользователь добавляет новую строку текста или если текст переносится на следующую строку. Итак, я хочу, чтобы весь текст был виден в текстовом виджете, если пользователь добавляет новый текст или удаляет текст. Вот пример того, что я пытаюсь сделать:

mTextValue = new Text(compositeEditor, SWT.BORDER | SWT.WRAP | SWT.MULTI);
mTextValue.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
mTextValue.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));

mTextValue.addListener(SWT.Modify,new Listener() 
{
   protected int lines=1;

   public void handleEvent(Event e) 
   {                
     Text text = (Text) e.widget;   
     int newlines = text.getLineCount();                  

     if (newlines!=lines) 
     {
    lines=newlines;
    height = lines*16;
    width = 240;
    text.setSize(width,height);
    text.getShell().pack(true);
 }
}
});

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

Может ли кто-нибудь предложить, как я могу сделать так, чтобы текстовый виджет самостоятельно настраивал его высоту, чтобы соответствовать всему вводимому тексту, но оставлял ширину текстового виджета всегда фиксированной на заданном значении?

Спасибо.

1 Ответ

1 голос
/ 27 ноября 2011

Это может быть потому, что pack () пересчитывает предпочтительный размер.Я не вижу прямого способа установить предпочтительную ширину на постоянную.Но вы можете попробовать переопределить метод computeSize, чтобы передать фиксированную ширину в качестве подсказки суперклассу.

, т.е.

public Point computeSize(int wHint,
                         int hHint,
                         boolean changed)
{
    return super.computeSize(240, hHint, changed);
}
...