2013-02-02 50 views
3

我有JPanel帶有邊框,問題是當我在JFrame上添加面板時,需要面板大小,但我使用setPreferredSize來設置面板的首選大小。該框架的佈局是'BoxLayout',這裏是代碼:在JFrame上顯式設置jpanel的大小

public class ActionForm extends JFrame { 


    JPanel namePanel; 
    JPanel descPanel; 
    JLabel actionName; 
    JLabel nameLabel; 
    JTextField nameTextField, descTextField; 
    FlowLayout toolBarLayout = new FlowLayout();  

    public ActionForm() { 
     this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); 
     TitledBorder nameBorder= BorderFactory.createTitledBorder(
      "Change Description"); 
     nameBorder.setTitleJustification(TitledBorder.LEFT); 
     namePanel = new JPanel(toolBarLayout); 
     namePanel.setPreferredSize(new Dimension(150, 150)); 
     nameLabel = new JLabel("ButtonName"); 
     nameTextField = new JTextField("Action's Name", 50); 
     namePanel.add(nameLabel); 
     namePanel.add(nameTextField); 
     namePanel.setBorder(nameBorder); 
     namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
     this.add(namePanel); 
    } 

    public static void main(String[] args) { 
     ActionForm form = new ActionForm(); 
     form.setVisible(true); 
     form.setSize(970, 500); 
     form.setResizable(false); 
    } 
} 

爲什麼面板的大小沒有改變?

+0

你問爲什麼不setPreferredSize()似乎做任何事情?如果是這樣,這是因爲它的孩子的首選大小是對JFrame的一個建議,但是你明確地給它一個大小,所以它忽略了這個建議。調用frame.pack()而不是frame.setSize(w,h)將使它適當調整自身的大小,爲其子的首選大小提供恰當的大小。 –

回答

4
  • BoxLayout接受Min/Max/preferredSizeJComponents通過奠定來到這個LayoutManager

  • (我不想評論什麼,因爲我的答案會這麼長),請使用此來比較你的代碼代碼示例,有實現的所有良好(必需和重要)Swing rulles

例如

import java.awt.ComponentOrientation; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.border.TitledBorder; 

public class ActionForm { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame; 
    private JPanel namePanel; 
    private JLabel nameLabel; 
    private JTextField nameTextField; 
    private FlowLayout toolBarLayout = new FlowLayout(); 

    public ActionForm() { 
     TitledBorder nameBorder = BorderFactory.createTitledBorder(
      "Change Description"); 
     nameBorder.setTitleJustification(TitledBorder.LEFT); 
     namePanel = new JPanel(toolBarLayout); 
     namePanel.setPreferredSize(new Dimension(150, 150));// hardCoded sizing 
     namePanel.setMaximumSize(new Dimension(250, 150)); // hardCoded sizing 
     namePanel.setMinimumSize(new Dimension(150, 150)); // hardCoded sizing 
     nameLabel = new JLabel("ButtonName"); 
     nameTextField = new JTextField("Action's Name", 10); 
     namePanel.add(nameLabel); 
     namePanel.add(nameTextField); 
     namePanel.setBorder(nameBorder); 
     namePanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
     frame = new JFrame("Mix/Max/PreferredSize for BoxLayout"); 
     frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), 
      BoxLayout.Y_AXIS)); // otherwise nice exceptions java.awt.AWTError: 
           // BoxLayout can't be shared 
     frame.add(namePanel); 
     frame.setPreferredSize(new Dimension(970, 500)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ActionForm form = new ActionForm(); 
      } 
     }); 
    } 
} 
+0

好的,但是當你添加setMaximumSize(250,150)和setManimumSize(150,150)時會發生什麼? –