2010-09-09 64 views
1

使用GroupLayout和下面的代碼,我注意到leftPanel沒有更新它的首選大小。我認爲這應該是自動的,似乎可以在其他佈局管理器中工作。我如何通過GroupLayout獲得該行爲?爲什麼我的JPanel的首選大小在其包含的JScrollPane在GroupLayout中有更改時會更改?

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class SizeTesting { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400,400); 

     JSplitPane splitPane = new JSplitPane(); 

     final JPanel leftPanel = new JPanel(); 
     final DefaultListModel listModel = new DefaultListModel(); 
     final JList list = new JList(listModel); 
     final JScrollPane jsp = new JScrollPane(list); 
     leftPanel.add(jsp); 

     splitPane.setLeftComponent(leftPanel); 

     GroupLayout panel1Layout = new GroupLayout(leftPanel); 
     leftPanel.setLayout(panel1Layout); 
     panel1Layout.setHorizontalGroup(
      panel1Layout.createParallelGroup() 
       .addComponent(jsp, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 157, Short.MAX_VALUE) 
     ); 
     panel1Layout.setVerticalGroup(
     panel1Layout.createParallelGroup() 
      .addGroup(GroupLayout.Alignment.TRAILING, panel1Layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jsp, GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)) 
     ); 



     JPanel rightPanel = new JPanel(); 

     JButton button = new JButton("Add Long Item"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent actionEvent) { 
       System.out.println("Preferred Size of List BEFORE: " + list.getPreferredSize()); 
       System.out.println("Preferred Size of ScorllPane BEFORE: " + jsp.getPreferredSize()); 
       System.out.println("Preferred size of LeftPanel BEFORE: " + leftPanel.getPreferredSize()); 
       System.out.println(); 

       listModel.addElement("Really long, new Item in List"); 
       System.out.println("Preferred Size of List AFTER: " + list.getPreferredSize()); 
       System.out.println("Preferred Size of ScorllPane AFTER: " + jsp.getPreferredSize()); 
       System.out.println("Preferred size of LeftPanel AFTER: " + leftPanel.getPreferredSize()); 
      } 
     }); 
     rightPanel.add(button); 
     splitPane.setRightComponent(rightPanel); 

     listModel.addElement("Test"); 
     listModel.addElement("Test2"); 
     listModel.addElement("Test3"); 

     frame.add(splitPane); 
     frame.setVisible(true); 
    } 
} // end class SizeTesting 

回答

1

組件的首選大小基於添加到組件的首選大小。

是的,當您將項目添加到列表中時,JList的首選大小會發生變化。但是,JList被添加到JScrollPane,所以它的JScrollPane的首選大小用於確定JPanel的首選大小。

由於您使用IDE來創建GUI,因此看起來像JScrollPane的首選大小在設計時確定並硬編碼到約束中。 JScrollPane的首選大小不會隨着框架的大小調整或將項目添加到JList而改變。 JScrollPane和JPanel的「大小」會隨着框架的大小而改變。

+0

是的,我似乎不公平地指責GroupLayout。在我的代碼中,GUI構建器在addComponent()方法中設置JScrollPane的首選大小。一旦像這樣手動設置組件的preferredSize,它就不會再次「自動調整」它的preferredSize,這就是問題的原因。 有沒有什麼辦法來恢復組件的preferredSize的「自動調整大小」行爲,我想知道? – acarlow 2010-09-10 07:34:11

+0

你可以通過setPreferredSize(null)來做到這一點。 – Dave 2011-05-05 13:24:38

1

並非所有的LayoutManagers在執行佈局時都會考慮Component.preferredSize()。我知道的那兩個是FlowLayout和BoxLayout(其他人可能,但他們可能不會)。

+1

我知道preferredSize並不總是得到尊重,但事情是它甚至沒有重新計算。我的理解是,一般來說,容器將根據其組件的preferredSizes重新計算其preferredSize,即使這些大小不受layoutManager的尊重。也許我的假設不正確。 – acarlow 2010-09-10 03:11:24

相關問題