2011-08-25 73 views
2

我迷失在Swing佈局的惡夢:(我要揭露我的問題,但我正在尋找建議,以及明確的解決方案Swing佈局問題

我的問題。我想設計一種形式是這樣的:

private void initComponents() { 

    buttonGroup1 = new javax.swing.ButtonGroup(); 
    buttonGroup2 = new javax.swing.ButtonGroup(); 
    jPanel1 = new javax.swing.JPanel(); 
    jPanel2 = new javax.swing.JPanel(); 
    jTextField1 = new javax.swing.JTextField(); 
    jTextField2 = new javax.swing.JTextField(); 
    jPanel3 = new javax.swing.JPanel(); 
    jPanel4 = new javax.swing.JPanel(); 
    jRadioButton1 = new javax.swing.JRadioButton(); 
    jRadioButton2 = new javax.swing.JRadioButton(); 
    jRadioButton3 = new javax.swing.JRadioButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setMinimumSize(new java.awt.Dimension(200, 200)); 

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 44)); 
    jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS)); 

    jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 255, 255))); 
    jPanel2.setMaximumSize(new java.awt.Dimension(11111111, 2147483647)); 
    jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.X_AXIS)); 

    jTextField1.setFont(new java.awt.Font("Lucida Grande", 0, 48)); // NOI18N 
    jTextField1.setText("jTextField1"); 
    jTextField1.setAlignmentY(0.0F); 
    jTextField1.setMaximumSize(new java.awt.Dimension(150, 2147483647)); 
    jTextField1.setPreferredSize(new java.awt.Dimension(100, 42)); 
    jPanel2.add(jTextField1); 

    jTextField2.setFont(new java.awt.Font("Lucida Grande", 0, 8)); // NOI18N 
    jTextField2.setText("jTextField2"); 
    jTextField2.setAlignmentY(0.0F); 
    jTextField2.setMaximumSize(new java.awt.Dimension(150, 2147483647)); 
    jTextField2.setPreferredSize(new java.awt.Dimension(100, 28)); 
    jTextField2.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jTextField2ActionPerformed(evt); 
     } 
    }); 
    jPanel2.add(jTextField2); 

    jPanel1.add(jPanel2); 

    jPanel3.setForeground(new java.awt.Color(255, 51, 51)); 
    jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.LINE_AXIS)); 

    jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.Y_AXIS)); 

    jRadioButton1.setText("jRadioButton1"); 
    jPanel4.add(jRadioButton1); 

    jRadioButton2.setText("jRadioButton2"); 
    jPanel4.add(jRadioButton2); 

    jRadioButton3.setText("jRadioButton3"); 
    jPanel4.add(jRadioButton3); 

    jPanel3.add(jPanel4); 

    jPanel1.add(jPanel3); 

    getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); 

    pack(); 
} 

東西我真的不明白的是:

enter image description here

而且我與Netbeans的生成代碼掙扎當我更改jPanel3的佈局時,ther是jPanel2的渲染更改!

有人可以給我一個howto的路徑?

+0

無論如何,有人會推薦MigLayout,並且'某人'碰巧是我的 – Tedil

+2

+1。 :D –

+0

「當我更改jPanel3的latout時,ther是jPanel2的渲染更改!」 - 你如何改變jPanel3的佈局?使用GUIBuilder還是手動?如果手動,請嘗試使用guibuilder來實現此目的。 –

回答

2

我建議使用GridBagLayout,因爲它可以讓您最好地控制組件的位置和佔用的空間。

例如,爲了使JPanel的2和3填滿你的內容窗格中,您會怎麼做:

GridBagConstraints constraints = new GridBagConstraints(); 
JPanel jPanel1 = new JPanel(new GridBagLayout()); 
constraints.fill = GridBagConstraints.HORIZONTAL; 
jPanel1.add(jPanel2, constraints); 
constraints.gridy ++; 
jPanel1.add(jPanel2, constraints); 

另外,如果你希望當您返回到它的Swing代碼是可以理解的幾天後,你會希望將其分解爲函數並使用更多描述性變量名稱,如「topTextPanel」和「middleButtonPanel」。

+0

爲什麼這個答案被低估了,我錯過了這裏的任何邏輯原因,這很可能,嗯:-)因爲我會使用一些來自'嵌套佈局'的無數變體:-) – mKorbel

+0

我個人是一個巨大的'GridBagLayout'和'GridBagConstraints'的粉絲。除了基本的對話框之外,我會非常推薦他們使用幾乎任何的swing GUI。你從字面上可以對他們做任何事情,而且一旦你掌握了它,這一切都很容易。 – gnomed

+0

是的,我個人使用Facade Pattern來減少使用JPanel和GridBagConstraints的冗長性。 Swing的整個佈局API本身非常令人痛苦。 –

2

類似的東西可能是使用BoxLayout的起點:

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

JPanel panel2= new JPanel(); 
panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS)); 
panel2.setMinimumSize(...); panel2.setMaximumSize(...) ; panel2.setPreferredSize(...); 

JPanel panel3 = new JPanel(); 
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS)); 
panel3 .setMinimumSize(...); panel3 .setMaximumSize(...) ; panel3 .setPreferredSize(...); 

JTextField tf1 = new JTextField("text_field_1"); 
tf1.setMinimumSize(...); tf1.setMaximumSize(...) ; tf1.setPreferredSize(...); 

panel2.add(tf1); 
panel.add(panel2); 
panel.add(panel3); 
panel.add(Box.createVerticalGlue()); 
panel.add(Box.createRigidArea(new Dimension(...))); 
1

這是完全有可能與NetBeans。

但是,有三件事情你必須知道馬蒂斯(在NetBeans Swing的設計)工作:

  1. 爲了使容器適應周圍的內容,你必須調整容器,直到它捕捉到內容。

  2. 要使內容跟隨容器的大小,您必須調整內容的大小,直到它捕捉到容器的邊界。

  3. 您可以隨時手動配置通過右鍵單擊組件的組件的自動調整大小行爲,並選擇你想要的自動調整大小子菜單下。