Java GUI布局

时间:2013-04-22 09:30:31

标签: java swing layout user-interface layout-manager

有人可以告诉我我需要使用哪种java布局来实现下面的布局:

Correct AddressBook Layout

我目前正在使用FlowLayout但是我无法在输出窗口旁边输入输入字段:

Bad Layout

道歉,如果这是一个简单的问题,这是我第一次使用java。这是我的框架代码:

    private void makeFrame()
     {
       setLayout(new FlowLayout(0));

    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel();
    JPanel panel4 = new JPanel();
    JPanel panel5 = new JPanel();
    JPanel panel6 = new JPanel();
    JPanel panel7 = new JPanel();

    panel1.setLayout(new FlowLayout(0));
    panel2.setLayout(new FlowLayout(0));
    panel3.setLayout(new FlowLayout(0));
    panel4.setLayout(new FlowLayout(0));
    panel5.setLayout(new FlowLayout(0));
    panel6.setLayout(new FlowLayout(0));
    panel7.setLayout(new FlowLayout(0));

    JLabel firstnameJLabel = new JLabel("First Name");
    JLabel lastnameJLabel = new JLabel("Last Name");
    JLabel streetJLabel = new JLabel("Street");
    JLabel townJLabel = new JLabel("Town");
    JLabel postcodeJLabel = new JLabel("Post Code");


    panel1.add(listAllBtn);
    panel1.add(listPersonalBtn);
    panel1.add(listBusinessBtn);
    panel1.add(addPersonalBtn);
    panel1.add(addBusinessBtn);
    panel1.add(deleteBtn);
    panel1.add(findBtn);
    panel1.add(quitBtn);


    panel2.add(firstnameJLabel);
    panel2.add(this.firstNameField);
    panel2.add(this.bookScrollPane);
    this.outputArea.setEditable(false);


    panel3.add(lastnameJLabel);
    panel3.add(this.lastNameField);

    panel4.add(streetJLabel);
    panel4.add(this.streetField);

    panel5.add(townJLabel);
    panel5.add(this.townField);

    panel6.add(postcodeJLabel);
    panel6.add(this.postcodeField);

    panel7.add(enterBtn);


    add(panel1);
    add(panel2);
    add(panel3);
    add(panel4);
    add(panel5);
    add(panel6);
    add(panel7);

    enterBtn.addActionListener(this);
  }

5 个答案:

答案 0 :(得分:4)

使用多个嵌套布局管理器

该示例看起来像顶级BorderLayout,其CENTER位置的滚动窗格,FlowLayout位置的一行按钮(使用NORTH)和GridLayout位置的文本字段WEST。后者可以通过使用GroupLayout来改进,它允许行和列单独调整大小,但使用起来有点复杂。

有一个很棒的tutorial on using layout managers(不幸的是,它似乎从Oracle的服务器上消失了,链接指向一个可能是短暂的副本)。

答案 1 :(得分:3)

自从我使用Swing以来已经有一段时间了,但看起来架构是这样的:

enter image description here

  1. 底部有一个面板是BorderLayout
  2. 在其中,您总共添加了4个新面板,NORTH,WEST,CENTER和EAST
  3. 在BorderLayout.NORTH中添加一个具有FlowLayout.LEFT
  4. 的面板 在BorderLayout.WEST中
  5. 添加一个具有GroupLayout.YAXIS的面板。此面板包含名称等标签和ENTER按钮
  6. 在BorderLayout.CENTER中
  7. 添加与标签
  8. 对应的文本字段 在BorderLayout.EAST中
  9. 添加JSCrollpane。
  10. 这可能会给你一个想法,你可以使用这些不同的面板来实现你想要的东西

答案 2 :(得分:0)

我只是将MigLayout用于高级页面布局,然后下拉到简单的布局管理器。它本质上是一种网格布局,但它非常易于使用。虽然Miglayout无法包装项目,但这显然是Swing中的一个设计问题。 WrapLayout是一个布局管理器,可以为您提供该功能,但它可能存在问题。

http://tips4java.wordpress.com/2008/11/06/wrap-layout/

看着你提供的屏幕截图,我已经嘲笑了你想要分割它的方式。你总共有9行(0-8)和3列(0-2)。对于像顶部控件这样的东西,你将在所有三列中“跨越”它们。

对于文本,您只需将文本放在第1行第1列中的单个框内,第1列为第2行,第1列为“姓”等。

您对输入框执行相同的操作。

在下图中,蓝色是列,橙色是行。

grid layout

总结一下;

  • 使用Miglayout进行高级布局。这就像在HTML中使用表格一样。
  • 使用其他布局管理器来布局Miglayout提供的网格框内的项目。

答案 3 :(得分:0)

最好的选择是使用 Gridbag布局,因为你有一点复杂的UI和GridBag布局提供了实现精确UI所需的所有支持。你将不得不使用父面板然后是其中的子面板。每个面板你必须添加单独的GridBag布局。你可以添加插入和必要的增长来实现你想要的。

答案 4 :(得分:0)

如上一条评论所述,我会在这个项目中使用MigLayout。因为您可以在每个字段或文本框之后使用split,span和wrap以获得正确的布局。您还可以调试Miglayout并查看布局的正确与错误。

在此处下载最新版本的MigLayout:http://www.migcalendar.com/miglayout/versions/

如果使用eclipse,

  • 将其保存在项目文件夹中名为Lib的文件夹中。
  • 配置项目构建路径,但将jar文件添加到类路径中。
  • 然后您应该能够将布局设置为MigLayout。

panel.setLayout(new MigLayout());

或调试布局 - panel.setLayout(new MigLayout("debug"));