使用哪种布局以及如何使用?

时间:2014-02-11 14:14:19

标签: java swing layout

我想设计一个简单的表单,有5个组件:

2个标签,1个测试字段,1个密码文本字段和1个按钮。我想要一个标签,并在文本字段右边。

一行向下(或更多,应该看到一个漂亮的空间)我想要第二个标签,其中passwordtextfield是正确的。

在下面的第三行,在中间,我想要按钮。

我试图在没有WindowsBuilder或任何辅助工具的情况下这样做,但是,我是Java的新手。

package HR;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;


import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JFormattedTextField;
import javax.swing.JButton;

import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class SignIn extends JFrame
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public SignIn()
    {
        this.setTitle("HR SYSTEM LOGIN SCREEN");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(100, 100, 308, 179);
        JPanel contentPane = new JPanel();
        this.getContentPane().add(contentPane);

        JLabel userName = new JLabel("User Name");
        contentPane.add(userName);

        JLabel password = new JLabel("Password");
        contentPane.add(password);

        JFormattedTextField userText = new JFormattedTextField();
        contentPane.add(userText);

        JPasswordField passwordText = new JPasswordField();
        contentPane.add(passwordText);

        JButton signButton = new JButton("Sign In");
        contentPane.add(signButton);



    }

}

5 个答案:

答案 0 :(得分:3)

使用WindowsBuilder,我会使用GroupLayout(标准API),MigLayout(第三方)或JGoodies FormLayout(第三方)。所有这些都得到很好的支持,并会做你想要的。如果您打算手工编写UI代码(为什么?),MigLayout是一个不错的选择。

WindowsBuilder文档和优点:

  • GroupLayout:非常灵活的布局管理器,旨在供GUI Builders使用。摇摆开发的一个流行组合是Netbeans Swing GUI Builder (Matisse)和GroupLayout(但WindowsBuilder也做了很棒的工作)。作为Java开发人员长期以来,在WindowsBuilder Pro被Google收购并免费之前,我曾经保留一个Netbeans Window Open来构建UI :)。布局使用层次结构组以及大小调整和锚定策略,与Delphi中的工作方式有很大的相似之处。
  • MigLayout:自首次发布以来已经走了很长一段路。获得了“Java用途最灵活,最灵活的Swing和SWT布局管理器”的动力(引用WindowsBuilder文档)。它易于使用GUI Builder或手动使用。使用字符串常量或API检查约束。
  • JGoodies FormLayout:曾经是构建Swing Forms的非官方标准。它是一个灵活而精确的UI管理器,可以与JGoodies Looks结合使用,获得非常好的跨平台体验。它也可以手动使用,但与IntelliJ IDEA Swing GUI Designer等智能GUI编辑器结合使用时确实很有用(WindowsBuilder也可以)。它使用带有字符串描述和组件构建器的网格布局系统,使一切变得简单。

我的个人意见:

我是新人!我不知道该使用什么:使用GroupLayout,它是标准的,不需要第三部分jar文件。只是反对手动编辑UI代码的冲动(严重!)。

但我想手工编辑UI代码:好的,使用MigLayout,好的组件,很容易掌握字符串常量。

当我在其他操作系统中打开我的应用程序时,UI未正确呈现:使用JGoodies组合并遵循开发指南,也按照UI Builder提示添加间隙和其他空到处都是空间和限制。它可能看起来像是机器中的浪费,但是一旦您使用不同的DPI字体处理运行不同桌面环境的不同操作系统,UI将因您的额外工作而仍然可用。

答案 1 :(得分:2)

我会继续使用WindowBuilder或其他可视化GUI构建器进行初始布局。然后,您可以检查生成的代码并使用它来查看它是如何工作的。

我没有太多使用GroupLayout,但我更喜欢GridBagLayout。 GridBag起初很混乱,但是一旦掌握了它,它就不会太糟糕了。如果使用相对定位而不是绝对定位,则布局将更容易维护。

MiGLayout是另一个不错的布局,它比GridBagLayout更容易拿起,但它也不是完美的(或者至少,它不是几年前我上次使用它时)。当我用它来手工布置更复杂的面板时,它至少和GridBagLayout一样冗长。

如果你想手动调整布局,WindowBuilder实际上非常适合让你在WYSIWYG编辑和手工编码之间切换。在您开始手动调整之前,将GUI的某种工作版本提交到您的存储库(git,mercurial,cvs,svn等)永远不会受到伤害,以防万一您可以轻松地将修改后的代码与原始代码进行比较码。 (如果您还没有使用版本控制系统,请立即开始使用一个 。如果我不得不推荐一个,我会说使用git,但任何分布式版本控制系统都会更好比你现在正在做的那样,与你的IDE和/或工作流程的其他部分很好地集成的那个将为你节省更多的时间和挫折。)

请记住,有时使用嵌套布局很有用;你不一定要只坚持一个。

答案 2 :(得分:1)

你基本上有一个3 x 2网格,在这些单元格中有四个你正在显示一些东西。第五个元素横跨两个单元格。

我会使用Gridbaglayout来定位这五个元素。通过仔细使用GridBaylayoutConstraints,您可以调整组件的拉伸行为。即。文本字段应拉伸最大值。并且标签应该没有拉伸。

我还会在添加所有组件时为所有组件添加统一插件(最好在所有方向上为5px)。

下载教程: http://blue-walrus.com/2011/12/gridbaglayout-tutorial/

答案 3 :(得分:1)

与其他标准的LayoutManagers相比,GridBagLayout确实有更陡峭的学习曲线,但是一旦掌握了它,就可以在几分钟内手动编写这样的GUI代码:

package swing;

import java.awt.*;
import javax.swing.*;

public class LoginWithGridBagDemo implements Runnable
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new LoginWithGridBagDemo());
  }

  public void run()
  {
    JLabel userLabel = new JLabel("User Name");
    JLabel passLabel = new JLabel("Password");
    JTextField userText = new JTextField(20);
    JPasswordField passText = new JPasswordField(20);
    JButton loginButton = new JButton("Login");

    JPanel panel = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();

    gbc.insets = new Insets(4,4,4,4);
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.NONE;
    panel.add(userLabel, gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(userText, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.NONE;
    panel.add(passLabel, gbc);

    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(passText, gbc);

    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.fill = GridBagConstraints.NONE;
    gbc.anchor = GridBagConstraints.CENTER;
    gbc.gridwidth = 2;
    panel.add(loginButton, gbc);

    JFrame f = new JFrame("Login");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(new JScrollPane(panel));
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

此外,任何经常使用GridBagLayout的人都会编写辅助方法/类,这些方法/类可以简化上述代码并使GUI生成更简单。对于那些感兴趣的人,here's a post向您展示了我为使GBL生活更轻松所做的工作。

不要买入仇恨。这是一个非常强大的LayoutManager。

答案 4 :(得分:0)

放置所有你想要的东西我会使用gridbaglayout。 但这很复杂而且不容易处理, 所以在你的情况下,正常的gridlayout就足够了

http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html