2014-03-30 26 views
3

在下面的示例中,在邊界佈局的西側,有一個父面板,其中有一個BoxLayout和一對面板。問題在於西面板從上到下覆蓋整個區域。用於父面板內的子面板的FlowLayout消耗大量面積。是否可以根據組件壓縮每個JPanel?而且,即使窗口最大化,它也應該保持不變?根據存在於其中的組件調整jpanel的大小

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.BoxLayout; 
import javax.swing.JTextField; 
import javax.swing.JCheckBox; 
import javax.swing.JButton; 

public class Sample extends JFrame { 

    private JPanel contentPane; 
    private JTextField textField; 
    private JTextField textField_1; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Sample frame = new Sample(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Sample() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.NORTH); 

     JLabel lblNewLabel = new JLabel("New label"); 
     panel.add(lblNewLabel); 

     JPanel panel_1 = new JPanel(); 
     contentPane.add(panel_1, BorderLayout.WEST); 
     panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS)); 

     JPanel panel_2 = new JPanel(); 
     panel_1.add(panel_2); 

     textField = new JTextField(); 
     panel_2.add(textField); 
     textField.setColumns(2); 

     textField_1 = new JTextField(); 
     panel_2.add(textField_1); 
     textField_1.setColumns(2); 

     JPanel panel_3 = new JPanel(); 
     panel_1.add(panel_3); 

     JCheckBox chckbxNewCheckBox = new JCheckBox("New check box"); 
     panel_3.add(chckbxNewCheckBox); 

     JPanel panel_4 = new JPanel(); 
     panel_1.add(panel_4); 

     JButton btnNewButton = new JButton("New"); 
     panel_4.add(btnNewButton); 

     JButton btnNewButton_1 = new JButton("New"); 
     panel_4.add(btnNewButton_1); 
    } 

} 
+0

嘗試** ** GridBagLayout的感謝 – Braj

回答

3

一種方法是添加到panel_1一個封閉面板。默認FlowLayout符合封閉組件的首選大小,當您pack()封閉Window。我已將一個灰色面板作爲佔位符添加到CENTER;調整框架大小以查看效果。

JPanel flowPanel = new JPanel(); 
flowPanel.add(panel_1); 

image

爲試:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.BoxLayout; 
import javax.swing.JTextField; 
import javax.swing.JCheckBox; 
import javax.swing.JButton; 

public class Sample extends JFrame { 

    private JPanel contentPane; 
    private JTextField textField; 
    private JTextField textField_1; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        Sample frame = new Sample(); 
        frame.pack(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Sample() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JPanel panel = new JPanel(); 
     contentPane.add(panel, BorderLayout.NORTH); 

     JLabel lblNewLabel = new JLabel("New label"); 
     panel.add(lblNewLabel); 

     JPanel panel_1 = new JPanel(); 
     panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS)); 

     JPanel panel_2 = new JPanel(); 
     panel_1.add(panel_2); 

     textField = new JTextField(); 
     panel_2.add(textField); 
     textField.setColumns(2); 

     textField_1 = new JTextField(); 
     panel_2.add(textField_1); 
     textField_1.setColumns(2); 

     JPanel panel_3 = new JPanel(); 
     panel_1.add(panel_3); 

     JCheckBox chckbxNewCheckBox = new JCheckBox("New check box"); 
     panel_3.add(chckbxNewCheckBox); 

     JPanel panel_4 = new JPanel(); 
     panel_1.add(panel_4); 

     JButton btnNewButton = new JButton("New"); 
     panel_4.add(btnNewButton); 

     JButton btnNewButton_1 = new JButton("New"); 
     panel_4.add(btnNewButton_1); 

     JPanel flowPanel = new JPanel(); 
     flowPanel.add(panel_1); 
     contentPane.add(flowPanel, BorderLayout.WEST); 
     contentPane.add(new JPanel(){ 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(320, 240); 
      } 

      @Override 
      public Color getBackground() { 
       return Color.lightGray; 
      } 

     }, BorderLayout.CENTER); 
    } 

} 
+0

。這工作!還需要知道如果我要在下面再添加一組相同的組件?由於這是一個'FlowLayout',有沒有其他方法可以做到這一點? – Mercenary

+0

是的;將流程面板的兩個實例添加到垂直的「Box」或「GridLayout」;另見['NestedLayoutExample'](http://stackoverflow.com/a/5630271/230513)。 – trashgod

+0

嗯是的。得到它了!謝謝 – Mercenary

相關問題