有人可以告诉我我需要使用哪种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);
}
答案 0 :(得分:4)
使用多个嵌套布局管理器
该示例看起来像顶级BorderLayout
,其CENTER
位置的滚动窗格,FlowLayout
位置的一行按钮(使用NORTH
)和GridLayout
位置的文本字段WEST
。后者可以通过使用GroupLayout
来改进,它允许行和列单独调整大小,但使用起来有点复杂。
有一个很棒的tutorial on using layout managers(不幸的是,它似乎从Oracle的服务器上消失了,链接指向一个可能是短暂的副本)。
答案 1 :(得分:3)
自从我使用Swing以来已经有一段时间了,但看起来架构是这样的:
这可能会给你一个想法,你可以使用这些不同的面板来实现你想要的东西
答案 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列为“姓”等。
您对输入框执行相同的操作。
在下图中,蓝色是列,橙色是行。
总结一下;
答案 3 :(得分:0)
最好的选择是使用 Gridbag布局,因为你有一点复杂的UI和GridBag布局提供了实现精确UI所需的所有支持。你将不得不使用父面板然后是其中的子面板。每个面板你必须添加单独的GridBag布局。你可以添加插入和必要的增长来实现你想要的。
答案 4 :(得分:0)
如上一条评论所述,我会在这个项目中使用MigLayout。因为您可以在每个字段或文本框之后使用split,span和wrap以获得正确的布局。您还可以调试Miglayout并查看布局的正确与错误。
在此处下载最新版本的MigLayout:http://www.migcalendar.com/miglayout/versions/
如果使用eclipse,
panel.setLayout(new MigLayout());
或调试布局 - panel.setLayout(new MigLayout("debug"));