0

在下面的代码中,当 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

4 回答 4

3

JPanel它本身不执行布局,它使用LayoutManager. 在您的情况下,您想要覆盖默认值FlowLayout并使用GridLayout(就像您为您所做的那样JFrame)。所以就这样做吧!

JPanel panel = new JPanel(new GridLayout(3, 2));
...
于 2012-03-26T15:10:21.593 回答
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的更多信息

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

于 2012-03-26T15:14:20.170 回答
2

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

JPanel panel = new JPanel();

默认情况下,使用这一行,正如您从 JPanel API 中看到的那样,您正在创建一个布局为FlowLayout. JPanel API报告关于空的构造函数:

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

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

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

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

这个页面和这里有一些关于 JPanel 和布局的教程。

于 2012-03-26T15:38:10.270 回答
1

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

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

于 2012-03-26T15:32:25.147 回答