在layerLayout中{textArea growByLimit问题

时间:2016-03-13 07:09:31

标签: codenameone

我将textArea setGrowByContent设置为true,将setGrowLimit设置为2,但始终只有一行。所以我扭曲了代码并增加了代码 如果textArea的大小大于Button大小,则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适合单行,并在下面留下额外的行/行。

PS看截图。三江源

enter image description here

没有calcPreferred大小或preferredSize:

enter image description here

如果删除了calcPreferredSize,它会占用整个屏幕宽度,尽管它在gridlayout中有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();

2 个答案:

答案 0 :(得分:0)

当您想要自动计算某些内容时,请勿使用calcPreferredSizesetPreferred*或任何此类API。

根据定义,当您使用这些API时,您将禁用自动计算,这就是大多数这些API被弃用的原因。

您只需要使用布局逻辑。

答案 1 :(得分:0)

我做了什么才能使它在图层布局和textarea中正确,它没有工作,所以我尝试了其他的东西,它的工作。我用边框布局设置了容器的bg图像&将textarea保留在边界布局的南部。

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();