2016-02-12 79 views
0

我有一個父級JPanel parentPanel用GridBagLayout進行佈局。這些內部面板我還有一個3孩子JPanels("childPanel1", "childPanel2", "childPanel3")這樣的:不允許添加組件來調整JPanel的大小

_____ _____ 
|  | 2 | 
| 1 |_____| 
|  | 3 | 
|_____|_____| 

我加入了panelParent在一個固定大小的JFrame與BorderLayout.CENTER和我想的框架保持固定(不調整大小),600 * 400 兒童面板的寬度都是相同的,我希望他們保持平等。
對於子面板,我也使用了GridBagLayout。
我在childPanel1裏面安排了組件,所有的寬度都相等。

問題:當我開始將組件添加到childPanel2中時,它調整了其自身和其他2個childPanel。 子面板寬度不再相同。它變成像這樣:

____ ______ 
| | 2 | 
| 1 |______| 
| | 3 | 
|____|______| 

我有兩個問題,

  1. 我如何才能讓孩子不面板調整大小後,我加入 組件放進去,都具有相同的寬度?
  2. 面板的自動調整大小與JPanel,父母 佈局,子佈局或組件屬性有關嗎?

我剛剛開始讓我的頭繞着鞦韆。

謝謝!

回答

2

最簡單的(但很可能不是最好的)的方式很可能是隻覆蓋每一個孩子JPanelgetPreferredSize方法:

enter image description here


代碼:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Example { 

    public Example() { 

     JPanel parentPanel = new JPanel(new GridBagLayout()); 
     parentPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.weighty = 1; 
     gbc.weightx = 1; 
     gbc.gridheight = 2; 
     parentPanel.add(createChildPanel(1), gbc); 
     gbc.gridx = 1; 
     gbc.gridy = 0; 
     gbc.gridheight = 1; 
     parentPanel.add(createChildPanel(2), gbc); 
     gbc.gridx = 1; 
     gbc.gridy = 1; 
     parentPanel.add(createChildPanel(3), gbc); 

     JFrame frame = new JFrame(); 
     frame.getContentPane().setLayout(new GridBagLayout()); 
     frame.getContentPane().add(parentPanel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600, 400); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JPanel createChildPanel(int number) { 
     JPanel panel = new JPanel(new BorderLayout()) { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(150, 150); 
      } 
     }; 

     JPanel addPanel = new JPanel(); 
     addPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, Color.LIGHT_GRAY)); 

     JButton addButton = new JButton("+"); 
     addButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       addPanel.add(new JLabel("Label")); 
       addPanel.revalidate(); 
       addPanel.repaint(); 
      } 
     }); 

     JButton deleteButton = new JButton("-"); 
     deleteButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (addPanel.getComponentCount() > 0) { 
        addPanel.remove(addPanel.getComponent(addPanel.getComponentCount() - 1)); 
        addPanel.revalidate(); 
        addPanel.repaint(); 
       } 
      } 
     }); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(addButton); 
     buttonPanel.add(deleteButton); 

     JLabel label = new JLabel(String.valueOf(number)); 
     label.setHorizontalAlignment(JLabel.CENTER); 

     panel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); 
     panel.add(label, BorderLayout.NORTH); 
     panel.add(addPanel); 
     panel.add(buttonPanel, BorderLayout.SOUTH); 
     return panel; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example(); 
      } 
     }); 
    } 

} 
相關問題