Java中的任何JPanel限制?

时间:2012-03-26 15:06:47

标签: java swing layout-manager border-layout flowlayout

在下面的代码中,当一个JPanel没有添加到JFrame扩展时,程序工作正常但是,我注释掉了JPanel并使用了GridLayout,一切都正确并且很好地放置在JFrame上。对JPanel如何显示对象有什么限制吗?在代码中,我已经注释掉了以下语句:

  this.setLayout(new GridLayout(3,2));
   this.add(nameLabel);
   this.add(name);
   this.add(urlLabel);
   this.add(url);
   this.add(typeLabel);
   this.add(type);

并且程序显示错误,但如果上述陈述未被注释且下面的陈述被评论:

   //add some panes..
    JPanel panel = new JPanel();
    panel.add(nameLabel);
    panel.add(name);
    panel.add(urlLabel);
    panel.add(url);
    panel.add(typeLabel);
    panel.add(type);
    this.add(panel);

,那么程序运行正常。以下是完整的代码摘录。

[CODE]

public class FeedInfo extends JFrame {
  private JLabel nameLabel = new JLabel("Name:", SwingConstants.RIGHT);
  private JTextField name;
  private JLabel urlLabel = new JLabel("URL",SwingConstants.RIGHT);
  private JTextField url;
  private JLabel typeLabel = new JLabel("Type",SwingConstants.RIGHT);
  private JTextField type;


   public FeedInfo()
      {
         super("Feed Information");
         this.setSize(400,105);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         String response1 = JOptionPane.showInputDialog(null,"Enter the site name:");
         name = new JTextField(response1,20);
         String response2 = JOptionPane.showInputDialog(null,"Enter the site address:");
         url = new JTextField(response2, 20);

         String[] choices ={"Personal","Commercial","Unkown"};
         int response3 = JOptionPane.showOptionDialog(null, "what type of site is it?",
           "site Type",0, JOptionPane.QUESTION_MESSAGE, null, choices, choices[0]);

        type = new JTextField(choices[response3],20);
        //add some panes..
        JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);


        /*this.setLayout(new GridLayout(3,2));
       this.add(nameLabel);
       this.add(name);
       this.add(urlLabel);
       this.add(url);
       this.add(typeLabel);
       this.add(type);
       */

       this.setVisible(true);

    }
[/CODE]

4 个答案:

答案 0 :(得分:3)

JPanel不会自行执行布局,它使用LayoutManager。在您的情况下,您希望覆盖默认FlowLayout并使用GridLayout(就像您对JFrame所做的那样)。所以这样做!

JPanel panel = new JPanel(new GridLayout(3, 2));
...

答案 1 :(得分:2)

JPanel panel = new JPanel();
        panel.add(nameLabel);
        panel.add(name);
        panel.add(urlLabel);
        panel.add(url);
        panel.add(typeLabel);
        panel.add(type);
        this.add(panel);

执行此操作时,您将JPanel添加到JFrame,但JFrame的布局未更改,这意味着默认情况下它具有BorderLayout。尝试将最后一行更改为:add(panel, BorderLayout.CENTER); 您可以阅读有关JFrame here

的更多信息

此外,JPanel默认使用FlowLayout,这意味着将在“流畅的线条”中添加对象您应该在JPanel上设置布局以获得所需的结果

答案 2 :(得分:2)

您的程序没有按预期工作,使用第二部分代码,因为您正在使用

JPanel panel = new JPanel();

默认情况下,使用此行,您可以在JPanel API中看到,您正在创建一个布局为FlowLayout的JPanel。关于空构造函数的JPanel API报告:

JPanel() 
Creates a new JPanel with a double buffer and a flow layout.

通常,流布局是JPanel最简单的布局,并且不可能以易于理解的方式加载Swing内容。您正在使用的GridLayout提供了在网格中加载组件的功能,可以显示Java应用程序的GUI。

现在,您知道,因为使用基本FlowLayout的程序不会按预期显示所有的swing组件,就像在第一部分代码中一样,当您使用GridLayout时。 如果要创建带有GridLayout的JPanel,只需键入:

JPanel panel = new JPanel(new GridLayout(3, 2));

this页面和here中,有一些关于JPanel和布局的教程。

答案 3 :(得分:1)

有两个重要的事实要知道。默认情况下,JFrame使用BorderLayout。 JPanel默认使用Flowlayout。这就是为什么您会看到不同的行为,具体取决于您要将其他组件添加到哪个组件。

FlowLayout几乎一文不值,所以在使用JPanel时,你几乎总是想要改变它。 @Mark Peters向您展示了如何做到这一点。 BorderLayout几乎总是完美地用于顶级容器,我很少改变它。我倾向于几乎完全使用BoxLayout作为我的嵌套JPanels。