Re textArea, проблемы с ростомByLimit в layerLayout

Я установил textArea setGrowByContent true и setGrowLimit на 2, но всегда есть только одна строка. Поэтому я изменил код и увеличил высоту textArea вдвое, если размер textArea больше размера кнопки. Ниже приведены коды. Моя проблема в конце вопроса:

      Button homeButtonn = new Button(btnIcon){

      @Override
      protected Dimension calcPreferredSize() {
      System.out.println("Button size: " + super.calcPreferredSize());
      return super.calcPreferredSize(); 
      }

      @Override
      public void setUIID(String id) {
          super.setUIID("homeButtonn"); 
          }
      };

      TextArea buttonTitle = new TextArea(title){

      @Override
           protected Dimension calcPreferredSize() {
           System.out.println("textArea title: " + getText());
           System.out.println("Textarea size: " +super.calcPreferredSize());
           System.out.println("");
           return super.calcPreferredSize(); 
           }
      };
      buttonTitle.setUIID("smallLabel");
      buttonTitle.getAllStyles().setAlignment(Label.LEFT);
      zeroPaddingMargin(buttonTitle);                   

      if (buttonTitle.getPreferredW() -10 > homeButtonn.getPreferredW()) {
         buttonTitle.setPreferredH(buttonTitle.getPreferredH() * 2);
      }
      buttonTitle.setPreferredW(homeButtonn.getPreferredW() - 10);
      buttonTitle.getAllStyles().setMargin(3, 3, 3, 3);
      buttonTitle.setEditable(false);
      buttonTitle.setGrowByContent(true);
      buttonTitle.setGrowLimit(2);
      buttonTitle.setScrollVisible(false);
      gridContainer.add(LayeredLayout.encloseIn(homeButtonn, FlowLayout.encloseRightBottom(buttonTitle)));  

ВЫХОД:

Button size: width = 146 height = 140
textArea title: DJ and Sound
Textarea size: width = 194 height = 25

Здесь размер textArea больше размера кнопки, но если я установлю размер textArea с точным размером кнопки, он подойдет. Итак, как размер textArea может быть больше размера кнопки, а также все тексты textArea хорошо помещаются внутри кнопки? Проблема, которую я получил, заключается в том, что, поскольку размер textArea больше размера кнопки, высота textArea умножается вдвое на собственную высоту, но textArea хорошо вписывается в одну строку и оставляет дополнительную строку/строку ниже.

P.S. смотрите скрин. Спасибо

введите здесь описание изображения

без calcПредпочитаемый размер или предпочтительный размер:

введите здесь описание изображения

Если calcPreferredSize удален, он занимает всю ширину экрана, хотя он находится в сетке с 3 столбцами.

Обновление: недавний код без calcPreferredSize и textArea также вложен в контейнер

GridLayout gl2 = new GridLayout(counter / 3 + 1, 3);
gl2.setAutoFit(true);
Container gridContainer = new Container(gl2);
gridContainer.setScrollableY(true);
f.addComponent(gridContainer);  

imageUrl = entry.get("img").toString();
title = entry.get("name").toString();
homePlaceholder = homePlaceholder.scaled(screenWidth / 3 - 20, screenWidth / 3 - 26);
encodedHomePlaceholder = EncodedImage.createFromImage(homePlaceholder, true);
Image btnIcon = URLImage.createToStorage(encodedHomePlaceholder, "home_" + title + imageUrl, allUrl.globalHomeImageUrl + imageUrl, URLImage.RESIZE_SCALE_TO_FILL);
homeButton.setIcon(btnIcon);
TextArea buttonTitle = new TextArea(title);
buttonTitle.getAllStyles().setAlignment(Label.LEFT);
buttonTitle.getAllStyles().setMargin(3, 3, 3, 3);
buttonTitle.setEditable(false);
buttonTitle.setGrowByContent(true);
buttonTitle.setGrowLimit(2);
buttonTitle.setScrollVisible(false);
Container btnTitleContainer = new Container();
btnTitleContainer.addComponent(buttonTitle);
gridContainer.add(LayeredLayout.encloseIn(homeButton, FlowLayout.encloseRightBottom(btnTitleContainer)));
f.revalidate();

person beck    schedule 13.03.2016    source источник
comment
Как это выглядит без настроек предпочтительного размера/размера вычислений?   -  person Shai Almog    schedule 14.03.2016
comment
я обновил изображение выше без предпочтительного размера или размера calcPreferred   -  person beck    schedule 14.03.2016


Ответы (2)


Не используйте calcPreferredSize, setPreferred* или любой другой подобный API, если вы хотите, чтобы что-то вычислялось автоматически.

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

Вам нужно использовать только логику макета.

person Shai Almog    schedule 15.03.2016
comment
если я удалил calcpreferredSize, кнопка занимает всю ширину экрана, хотя она находится в сетке с 3 столбцами. см. скриншот выше. Но если нет текстовой области, то все работает нормально. Я также обновил код jst без calcpreferredSize - person beck; 16.03.2016
comment
Используйте конструктор области заголовка, который принимает столбцы и строки и явно устанавливает столбцы на что-то вроде 10. Затем вызовите setText. Конструктор, который принимает только строку, неявно устанавливает для столбцов ширину строки. - person Shai Almog; 17.03.2016
comment
это тоже не работает. Может быть, есть какие-то проблемы или ошибка в многоуровневом макете с текстовой областью, или я сделал что-то неправильно в своем коде, я не знаю, почему-то я не могу сделать это правильно в макете слоя. поэтому я пробовал другие вещи, и это работает, но у меня есть несколько простых вопросов. Взгляните на мой ответ. Спасибо - person beck; 23.03.2016

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

homePlaceholder = homePlaceholder.scaled(screenWidth / 3, screenWidth / 3);
encodedHomePlaceholder = EncodedImage.createFromImage(homePlaceholder, true);
Image btnIcon = URLImage.createToStorage(encodedHomePlaceholder, "home_" + title + imageUrl, allUrl.globalHomeImageUrl + imageUrl, URLImage.RESIZE_SCALE_TO_FILL);

Container innerContainer = new Container(new BorderLayout());
innerContainer.getAllStyles().setBgImage(btnIcon);
innerContainer.getAllStyles().setBackgroundType(Style.BACKGROUND_IMAGE_SCALED);
gridContainer.add(innerContainer);

TextArea buttonTitle = new TextArea(properCase(title));
buttonTitle.setUIID("smallLabel");
zeroPaddingMargin(buttonTitle);
innerContainer.add(BorderLayout.SOUTH,buttonTitle);

buttonTitle.setEditable(false);
buttonTitle.setGrowByContent(true);
buttonTitle.setGrowLimit(2);
buttonTitle.setScrollVisible(false);

gridContainer.revalidate();
person beck    schedule 23.03.2016
comment
У меня есть вопрос, @shai ... я масштабировал ширину и высоту заполнителя для urLImage совершенно одинаково, но в gridlayout высота bg-изображения больше ширины, как я могу получить идеальный квадрат в gridlayout. Я также проверил в конструкторе графического интерфейса, и результат тот же. - person beck; 23.03.2016