我们使用哪个布局管理器?
每个人都使用什么Java GUI布局管理器?最近,我一直在使用MigLayout,它具有一些强大的组件控件。只是想看看其他开发人员在使用除标准JDK之外的工具。
解决方案
Spring布局是为netbeans的尾数gui生成器开发的。
我使用的最后一个Swing应用程序使用了JGoodies的FormsLayout。
GridBagLayout可用。一旦习惯了使用它,它就会很好用。我认为标准的JDK布局管理器本身非常强大。另外,我们可以最大程度地减少对第三方库的依赖。
我使用GridBagLayout。它似乎需要很多代码,但是布局却非常漂亮。
我还喜欢将BorderLayout与GridBagLayout面板结合使用,以实现出色的可定制性。
我也使用了GroupLayout。同样,它是Java6的标准JDK布局管理器,但是我们也可以找到独立的库。
我是使用TableLayout而不是GridBagLayout的忠实粉丝。一切都说得通,而每次我尝试使用GridBagLayout时,我的心都被压碎了。
我真正喜欢的唯一布局管理器是相对布局管理器。相对布局管理器的工作方式与对话框在概念上的组织方式一致。一个缺点是,尽管此布局管理器处理添加约束。它似乎没有处理比率约束。幸运的是,它的设计非常好,我能够实现此功能。
作为一般概述,我们可能会发现我前一段时间在sun上写的一篇文章很有用。它与最新的布局管理器不是最新的,但它专注于布局管理器的有效嵌套,而不是尝试使用一个布局来完成所有操作。
参见http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr
MiG和FormLayout(JGoodies)都非常适合手动布局(几乎所有布局最终都变为手动)。我最大的建议是设计视图,以便我们可以完全删除布局并重新实现它,而又不影响应用程序(在这里,视图和控制器之间的良好分隔是关键。)
一定要看看JGoodie的PresentationModel方法来实现"哑巴"视图。我将这种技术与GUI构建器一起使用(我将Jigloo GUI构建器插件与GroupLayout一起使用)来扔掉快速原型。经过3或者4次迭代后,通常会消失在窗口中,我们使用MiG或者FormLayout进行重新实现。
编辑:自从我写这篇文章以来,我已经开始将MiG用于所有布局,而我不再使用GUI构建器,使用MiG布置内容太简单了。
我一直是GridBagLayout的忠实拥护者。它非常类似于HTML表格,因此对于那些Web程序员来说很直观。
我发现,对于任何非平凡的GUI,我使用带有嵌套子面板的多个布局,其中主面板可能具有一个" GridBagLayout",而每个子面板(通常没有边框或者表明它是一个面板)都使用一个尽可能简化布局。通常,对于较小,更简单的子面板,我将使用" BorderLayout"," FlowLayout"和" BoxLayout"。通过将GUI的小部分划分为子面板,并使用最简单的布局来控制GUI的该部分,我们可以创建复杂,排列合理的显示,而不会因" GridBagLayout"的众多选项而感到头疼。另外,通过将类似显示功能的面板分组,它可以创建更具可读性的代码。
MiGLayout是GUI布局管理器,已被Java开发人员广泛使用。
我开始使用各种嵌套布局,然后移到GridBagLayout(这非常令人沮丧)。从那时起,我尝试了FormLayout(但是发现它除了表格之外不适合其他任何东西),并坚定地选择TableLayout,总体而言,我对此感到非常满意。
从那时起,我发现了MiGLayout,尽管除了使用它以外,我没有做太多其他事情,但它似乎非常强大,与TableLayout十分相似,并且可能更清洁。
对我来说,最大的好处是MiGLayout即将成为JDK的一部分,因此我打算在它使用时几乎完全使用它。
要记住的另一件事是,不管我们选择使用哪种重量级的LayoutManager,始终都会有一些更简单的布局管理器(例如GridLayout)放置在一个地方。我已经看到了使用GridBagLayout做的一些可怕的事情,使用更简单的布局管理器可以更轻松地完成。
嵌套BoxLayout和SpringLayout时,我90%的时间使用BorderLayout
我曾经使用GridBagLayout作为控件,但是自从Java1.6起,我将使用GroupLayout太糟糕了。
这里是截图和示例代码以使用它!
替代文字http://img145.imageshack.us/img145/7844/screenshot1dz8.png
private void layoutComponents(){ JPanel panel = new JPanel(); GroupLayout layout = new GroupLayout(panel); panel.setLayout(layout); layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); SequentialGroup hGroup = layout.createSequentialGroup(); JLabel nameLbl = new JLabel("Name"); JLabel countLbl = new JLabel("Amount"); JLabel dateLbl = new JLabel("Date(dd/MM/yy)"); hGroup.addGroup(layout.createParallelGroup(). addComponent(nameLbl). addComponent(countLbl). addComponent(dateLbl). addComponent(go)); hGroup.addGroup(layout.createParallelGroup(). addComponent(name). addComponent(count). addComponent(date)); layout.setHorizontalGroup(hGroup); SequentialGroup vGroup = layout.createSequentialGroup(); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE). addComponent(nameLbl).addComponent(name)); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE). addComponent(countLbl).addComponent(count)); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE). addComponent(dateLbl).addComponent(date)); vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE). addComponent(go)); layout.setVerticalGroup(vGroup); frame.add( panel , BorderLayout.NORTH ); frame.add( new JScrollPane( textArea ) ); }
我的大多数面板都使用DesignGridLayout。
对于" DesignGridLayout"无法完全处理的罕见面板,我将Borderlayout和" DesignGridLayout"混合使用。
使用DesigngridLayout,我们可以使用最少的代码行来手动编码布局,这些代码行易于输入和阅读:
DesignGridLayouut layout = new DesignGridLayout(myPanel); layout.row().grid(lblFirstName).add(txfFirstName).grid(lblSurName).add(txfSurName); layout.row().grid(lblAddress).add(txfAddress); layout.row().center().add(btnOK, btnCancel);
面板网格的每一行都由一行代码定义。如我们所见,"绘制"面板非常简单。
另外,我发现DesignGridLayout
具有一些独特的功能(例如其"智能垂直调整大小")。
我将GridBagLayout用于诸如布局之类的表单,将BorderLayout用于简单的布局,将FlowLayout用于水平图标/按钮的数量,水平图标/按钮之间具有一定的间隔。 Netbeans还是一个很好的GUI构建器,可以避免许多繁琐的布局编码,以节省时间。
我希望尽量减少对第三方库的依赖,因此对于对话框,通常使用BoxLayout;对于"复杂"布局,通常使用GridBagLayout。 GridBagLayout很容易理解,但是有点难以配置。我为自己编写了一个用于从HTML布局创建代码的工具(希望对其他人也有帮助):
http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
我最近开始使用Swing,并且正在使用GridBagLayout。
GridBagLayout功能强大,但非常原始:连接布局的代码非常冗长。该实用程序库(实际上只有1个jar文件,其中包含约10个类)简化了许多工作:http://code.google.com/p/painless-gridbag/该站点首页引用了以下代码片段:
PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false); gbl.row().cell(lblFirstName).cell(txtFirstName).fillX() .cell(lblFamilyName).cell(txtFamilyName).fillX(); gbl.row().cell(lblAddress).cellXRemainder(txtAddress).fillX(); gbl.doneAndPushEverythingToTop();