2013-02-02 49 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)时会发生什么? –