布局管理器,用于在java中设置此特定布局

布局管理器,用于在java中设置此特定布局,java,swing,user-interface,layout-manager,Java,Swing,User Interface,Layout Manager,我有一个布局,我需要为作业编程,这是我第一次在GUI中使用布局管理器,所以我在匹配布局时遇到问题。我需要你的帮助 我有两个标签,分别是Account creation(账户创建)和Account transfer(账户转账)(这两个标签都可以)我需要的是在一行中包含JLabel(账户ID)和第一个文本字段,然后在第一行下的行中包含下一个JLabel(金额)和文本字段。下面需要以JButton为中心(创建一个帐户)。最后,JTextArea(无帐户)需要位于空白区域右侧的一列中,与标签、文本字段和

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

我有两个标签,分别是Account creation(账户创建)和Account transfer(账户转账)(这两个标签都可以)我需要的是在一行中包含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);
}

GridBagLayout
是最强大的布局,您可以使用它轻松实现类似网格的显示。这是一个包含
n
行和
m
列的布局,其中每个单元格在几个方面都可以独立于其他单元格进行自定义。在此布局中,您必须将
GridBagConstraints
对象附加到每个
面板。添加(JComponent,Constraints)
作为约束。在中,它明确规定了什么是可定制的。一开始可能看起来有点刺耳,但一旦你掌握了窍门,那就太棒了。它功能强大且灵活,您不必担心在其他布局中可能遇到的不可量化的限制

在您的布局中,我看到的最不方便的事情是将“Account ID”标签的中心与TextField对齐,并在两者上方留出空白。如果标签与文本字段的底部对齐,则会更容易。为了解决这个问题,我假设标签和文本字段位于我事先构建的一个面板内,该面板可以正确地相互对齐(很容易与BorderLayout或GridBagLayout…或其他任何东西对齐),我将只将面板放置在布局中

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

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

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

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

按钮

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

gridx = 1
gridy = 0
gridheight = 3
weightx = 0.5
fill = BOTH
我忽略了几个细节,但核心问题可以通过这些约束来解决。关于
GridBagLayout
要了解的最不明显的事情是权重在复杂情况下是如何工作的,例如,当同一列中有几个不同的
weightx
值时会发生什么。它算最大值吗?还是总数


为了便于讨论,您可以避免让这些面板使用一个额外的初始行,该行带有一个不可见的组件
weighty>0
,然后有两列:一列用于
JLabel
s,另一列用于
JTextField
s,带有一个前缀
锚点
s;按钮将具有
gridwith=2
。。。但这完全没有必要,我会选择两个辅助面板。

这就是我的方法。但是,它不会将外部面板添加到框架中,而是添加到选项卡式窗格的选项卡中

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

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

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

另见 另一个


你可以将你想要的和你得到的图片上传到另一个网站,然后在你的帖子中链接图片URL吗。有人可能会将它们编辑到你的帖子中,为你“我无法加载图像…”使用。试试这个URL好的,我很困惑。这是作业指定要做的截图,还是你目前看到的截图?顺便说一句-为什么要编写小程序?如果是由于老师的规范,请参考。注意,您可以嵌套多个布局,如+1所示,我喜欢在标题Border:-)@nIcEcOw中指定参数的想法。我将发布源代码(没有标题borders),但考虑到帖子的性质(学习如何使用布局)我觉得描述会更好。和“一幅画(一幅布局图)能画上千言万语(当布局图在有标题的边框中详细显示时)”。)这是完美的,正是我所需要的,我不希望仅仅把源代码放进去,因为我自然会复制和粘贴代码,而不是真正学习材料。我现在就要开始了。“我很感激你不只是把源代码放进去…”你让我开心了一天+1感谢你的态度-我认为你会走得更远(当你到达那里时,你会得到很好的评价)。谢谢你的回答我现在有一个工作模型,我很喜欢@andrewthompson如何建立他的模型
gridx = 0
gridy = 2
anchor = PAGE_START
weighty = 0.5
gridx = 1
gridy = 0
gridheight = 3
weightx = 0.5
fill = BOTH