2011-10-13 98 views
5

我有一個JPanel裏面BorderLayout.CENTER設置JPanel的最大尺寸內BorderLayout.CENTER

JPanel中有一個網格佈局,我想它與中心的寬度擴大,但高度必須在停止最大值並在可能的情況下使用preferredSize。

我有這樣的代碼

JPanel wrapperCenterPanel = new JPanel(new FlowLayout()); 
wrapperCenterPanel.add(centerPanel);  
panel.add(wrapperCenterPanel, BorderLayout.CENTER); 

centerPanel是我的面板(使用網格佈局),我用的FlowLayout面板包裹它,並把在中心這最後一個。

現在的大小是首選的,但它是固定的!如有必要,高度不會縮小,寬度也不會縮小。

我該怎麼做?

回答

15

嘗試使用BoxLayout作爲包裝面板。 BoxLayout尊重組件的最大/最小和首選大小。

+0

許多佈局管理器忽略最大大小。我不認爲你提到的錯誤是佈局管理器問題。 – camickr

4

我認爲不可能有BorderLayout的,尤其是對於BorderLayout.CENTER區域,也沒有side_effects根據碼

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ComponentEvent; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class CustomComponent extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public CustomComponent() { 
     setTitle("Custom Component Graphics2D"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void display() { 
     CustomComponents cc = new CustomComponents(); 
     cc.addComponentListener(new java.awt.event.ComponentAdapter() { 

      @Override 
      public void componentResized(ComponentEvent event) { 
       setSize(Math.min(getPreferredSize().width, getWidth()), 
         Math.min(getPreferredSize().height, getHeight())); 
      } 
     }); 
     add(cc, BorderLayout.CENTER); 

     CustomComponents cc1 = new CustomComponents(); 
     add(cc1, BorderLayout.EAST); 

     pack(); 
     // enforces the minimum size of both frame and component 
     setMinimumSize(getSize()); 
     //setMaximumSize(getMaximumSize()); 
     setVisible(true); 

    } 

    public static void main(String[] args) { 
     CustomComponent main = new CustomComponent(); 
     main.display(); 
    } 
} 

class CustomComponents extends JComponent { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public Dimension getMinimumSize() { 
     return new Dimension(100, 100); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(400, 300); 
    } 

    @Override 
    public Dimension getMaximumSize() { 
     return new Dimension(800, 600); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     int margin = 10; 
     Dimension dim = getSize(); 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2); 
    } 
} 
1

FLowLayout佈局管理器不引入自由空間在屏幕上閃爍的UFO;它使用每個組件的首選大小(請參閱Java API中的FlowLayout文檔)。

我個人會將您的包裝面板的佈局管理器更改爲GridBagLayout,並將其中的centerPanel添加到其中,並根據需要指定合適的GridBagConstraints對象來處理空間分配。