2

我有这个布局,我需要为分配进行编程,这是我第一次在 GUI 中使用布局管理器,所以我在让布局匹配时遇到了问题。我需要你的帮助

我有两个标记为帐户创建和帐户转移的选项卡(这些都可以)我需要的是在一行中有 JLabel(帐户 ID)和第一个文本字段,然后是下一行中的下一个 JLabel(金额)和文本字段第一的。在此之下需要以 JButton 为中心(创建帐户)。最后,JTextArea(无帐户)需要位于与标签、文本字段和按钮分开的空白区域右侧的列中。

在此处输入图像描述

这是我开始的代码:

public CreatePanel(Vector accountList, TransferPanel transferPanel)
{
this.accountList = accountList;
this.transferPanel = transferPanel;

JLabel l1 = new JLabel("Account ID");
JTextField t1 = new JTextField();
JLabel l2 = new JLabel("Amount");
JTextField t2 = new JTextField();
JButton b1 = new JButton("Create an Account");
JTextArea a1 = new JTextArea("No Account");

JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(2,3));
panel1.add(l1);
panel1.add(t1);
panel1.add(l2);
panel1.add(t2);
panel1.add(b1, BorderLayout.SOUTH);
b1.setVerticalAlignment(JLabel.CENTER);


JPanel panel2 = new JPanel();
panel2.add(a1);
a1.setSize(200, 300);

add(panel1);
add(panel2);
}
4

2 回答 2

3

这就是我将如何处理它。但是,不是将外部面板添加到框架中,而是将其添加到选项卡式窗格的选项卡中。

作业 6 截图

以上是嵌套或复合布局的示例。标题边框显示了使用的布局和用于构造它们的参数(如果有的话)。

按钮的大小由内容(文本)建议。构造函数中建议了文本字段和文本区域的大小(其本身已作为文本值包含在内)。

要在文本字段中获得 TALL 效果,请设置一个 HUGE 字体,但对构造函数使用较少的列。

也可以看看

另一种嵌套布局

于 2013-10-02T13:56:06.300 回答
2

GridBagLayout是最强大的布局,您可以使用它轻松实现类似网格的显示。n这是一种具有行和列的布局,m其中每个单元格在多个方面都可以独立于其他单元格进行自定义。在此布局中,您必须将一个GridBagConstraints对象panel.add(JComponent, Constraints)作为约束附加到每个对象。在本教程中,它明确指定了可定制的内容。一开始它可能看起来有点苛刻,但一旦你掌握了它,它就很棒。它功能强大且灵活,您不必担心其他布局可能遇到的不可定制的限制。

在您的布局中,我看到的最不方便的事情是“帐户 ID”标签的中心与 TextField 对齐,并且它们都带有空白区域。如果标签与 TextField 的底部对齐会更容易。为了解决这个问题,我假设 Label 和 TextField 位于我事先构建的面板内,该面板彼此正确对齐(很容易与 BorderLayout 或 GridBagLayout ......或任何其他东西),我只需将面板放在布局中。

然后我将此布局视为具有 3 行和 2 列的 GridBagLayout,如下所示:

GridBagLayout 行和列

这是我如何放置约束以指定布局中的每个组件的概述。

面板 1(帐户 ID 标签 + 文本字段)

gridx = 0
gridy = 0
weighty = 0.5
weightx = 0.5
anchor = PAGE_END
fill = HORIZONTAL

面板 2(金额标签 + 文本字段)

gridx = 0
gridy = 1
weighty = 0.0
fill = HORIZONTAL

按钮

gridx = 0
gridy = 2
anchor = PAGE_START
weighty = 0.5

文本区域

gridx = 1
gridy = 0
gridheight = 3
weightx = 0.5
fill = BOTH

我忽略了一些细节,但可以通过这些限制来解决核心问题。要了解的最不明显的事情GridBagLayout是权重如何在复杂情况下工作,例如当weightx同一列中有多个不同的值时会发生什么。它计算最大值吗?还是总和?...

为了讨论,您可以避免让这些面板使用额外的初始行,其中包含一个不可见的组件,weighty > 0然后有 2 列:一列用于JLabels,另一列用于JTextFields,带有 apropiate anchors;按钮会有gridwith = 2......但这完全没有必要,去两个辅助面板。

于 2013-10-01T23:04:40.300 回答