2

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

正确的地址簿布局

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

布局错误

抱歉,如果这是一个简单的问题,这是我第一次使用 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);
  }
4

5 回答 5

4

使用多个嵌套布局管理器

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

有一个关于使用布局管理器的很棒的教程(不幸的是,它似乎已经从 Oracle 的服务器上消失了,并且链接指向可能是临时副本)。

于 2013-04-22T09:39:59.237 回答
3

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

在此处输入图像描述

  1. 您在底部有一个面板,即 BorderLayout
  2. 在其中,您总共添加了 4 个新面板,NORTH、WEST、CENTER 和 EAST
  3. 在 BorderLayout.NORTH 中添加一个具有 FlowLayout.LEFT 的面板
  4. 在 BorderLayout.WEST 中添加一个具有 GroupLayout.YAXIS 的面板。此面板包含名称等标签和 ENTER 按钮
  5. 在 BorderLayout.CENTER 中添加与标签对应的文本字段
  6. 在 BorderLayout.EAST 中添加 JSCrollpane。

这可能会给您一个想法,您可以使用这些不同的面板来实现您想要的

于 2013-04-22T09:49:37.857 回答
0

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

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

看着你提供的屏幕截图,我模拟了你想要划分它的方式。您总共有 9 行 (0-8) 和 3 列 (0-2)。对于最顶部的控件之类的东西,您将“跨越”它们跨越所有三列。

对于文本,您只需将文本放在其单个框中的第 1 行、第 1 列用于名字,或第 2 行、第 1 列用于姓氏等。

你对输入框做同样的事情。

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

网格布局

所以总结一下;

  • 使用Miglayout进行高级布局。这就像在 HTML 中使用表格一样。
  • 使用其他布局管理器对 Miglayout 提供的网格框内的项目进行布局。
于 2013-04-22T09:53:57.500 回答
0

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

于 2013-04-22T09:53:57.637 回答
0

如上一条评论所述,我将在此项目中使用 MigLayout。因为您可以在每个字段或文本框之后使用拆分、跨度和换行以获得正确的布局。您还可以调试 Miglayout 并查看您的布局是对还是错。

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

如果使用日食,

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

panel.setLayout(new MigLayout());

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

于 2013-04-22T11:16:22.717 回答