ปัญหา textArea growByLimit ใน layerLayout อีกครั้ง

ฉันตั้งค่า textArea setGrowByContent จริงและ 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 พอดีในบรรทัดเดียวและปล่อยให้มีบรรทัด/แถวเพิ่มเติมอยู่ด้านล่าง

ป.ล. ดูภาพหน้าจอ ขอบคุณ

ป้อนคำอธิบายรูปภาพที่นี่

ไม่มีการคำนวณขนาดที่ต้องการหรือขนาดที่ต้องการ:

ป้อนคำอธิบายรูปภาพที่นี่

หากลบ 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
ฉันอัปเดต img ด้านบนโดยไม่มีขนาดที่ต้องการหรือขนาดที่ต้องการ   -  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 ได้อย่างไร ฉันตรวจสอบในตัวสร้าง gui เช่นกันและผลลัพธ์ก็เช่นเดียวกัน - person beck; 23.03.2016