【问题标题】:Layout issues using GridBagLayout使用 GridBagLayout 的布局问题
【发布时间】:2014-10-14 23:55:21
【问题描述】:

我想制作一个看起来或多或少如下图所示的应用程序:

我已经为 top JPanel 编写了代码,但我没有得到例外的结果。我的输出是这样的:

这是我的代码:

public class Main extends JPanel {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Main().frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Main() {
        frameinit();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void frameinit() {
        frame = new JFrame();
        frame.setTitle("Tool Title");
        frame.add(this);
        frame.setPreferredSize(new java.awt.Dimension(1000, 800));
        frame.setSize(new Dimension(1000,800));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);

        this.setLayout(new GridBagLayout());
        GridBagConstraints c;
        JLabel LTitle,Lcus,Lmode,Lsc,Lcorbank,Lavd,Lrate,Lcrate,Lvaldate,Lbc,Lr;
        JTextField Tcus,Tmode,Tsc,Tcorbank,Tavd,Trate,Tcrate,Tvaldate,Tbc,Tr;
        LTitle = new JLabel("Title");
        c = new GridBagConstraints();
        c.gridx=0;
        c.gridy=0;
        c.gridwidth=4;
        c.gridheight=1;
        add(LTitle, c);
        Lcus = new JLabel("Customer");
        c.gridx=0;
        c.gridy=1;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lcus, c);
        Lmode = new JLabel("Mode");
        c.gridx=0;
        c.gridy=2;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lmode, c);
        Lsc = new JLabel("Sell Ccy");
        c.gridx=0;
        c.gridy=3;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lsc, c);
        Lcorbank = new JLabel("Correspondant Bank");
        c.gridx=0;
        c.gridy=4;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lcorbank, c);
        Lavd = new JLabel("Amount Value Date");
        c.gridx=0;
        c.gridy=5;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lavd, c);
        Lrate = new JLabel("Rate");
        c.gridx=2;
        c.gridy=1;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lrate, c);
        Lcrate = new JLabel("Coverage Rate");
        c.gridx=2;
        c.gridy=2;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lcrate, c);
        Lavd = new JLabel("Value Date");
        c.gridx=2;
        c.gridy=3;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lavd, c);
        Lbc = new JLabel("Buy Ccy");
        c.gridx=2;
        c.gridy=4;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lbc, c);
        Lr = new JLabel("Remarks");
        c.gridx=2;
        c.gridy=5;
        c.gridwidth=1;
        c.gridheight=1;
        add(Lr, c);
        Tcus = new JTextField();
        c.gridx=1;
        c.gridy=1;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tcus, c);
        Tmode = new JTextField();
        c.gridx=1;
        c.gridy=2;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tmode, c);
        Tsc = new JTextField();
        c.gridx=1;
        c.gridy=3;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tsc, c);
        Tcorbank = new JTextField();
        c.gridx=1;
        c.gridy=4;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tcorbank, c);
        Tavd = new JTextField();
        c.gridx=1;
        c.gridy=5;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tavd, c);
        Trate = new JTextField();
        c.gridx=4;
        c.gridy=1;
        c.gridwidth=1;
        c.gridheight=1;
        add(Trate, c);
        Tcrate = new JTextField();
        c.gridx=4;
        c.gridy=2;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tcrate, c);
        Tvaldate = new JTextField();
        c.gridx=4;
        c.gridy=3;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tvaldate, c);
        Tbc = new JTextField();
        c.gridx=4;
        c.gridy=4;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tbc, c);
        Tr = new JTextField();
        c.gridx=4;
        c.gridy=5;
        c.gridwidth=1;
        c.gridheight=1;
        add(Tr, c);
    }

}

【问题讨论】:

  • 来自official tutorial:“除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件都会在其容器的中心聚集在一起。”。此外,您可能希望将一些值设置为 anchorfill
  • 哇它的工作。谢谢 DSquare。我努力添加了锚点和填充,我只是将 weightx 和 weight 添加到 1。谢谢兄弟。你能告诉我在这种情况下保持锚的价值吗?锚点只需要 pagestart、pageend 和 blablabla。在这里我认为我们不能使用它们对吗?
  • anchorfill 的默认值在大多数情况下工作得很好,但是它们对于进一步自定义每个组件的行为很有用。例如,如果您希望 JTextField 尽可能宽 (fill=HORIZONTAL),或者如果您希望它接触右边距而不是左边距 (anchor=LINE_END)...
  • @DSquare 请将您的 cmets 组成一个答案,以便(我可以投票并且......)OP 可以accept it

标签: java swing layout-manager gridbaglayout


【解决方案1】:

来自官方教程:

除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件都会在其容器的中心聚集在一起。

所以你只需要设置:

c.weightx=1.0;
c.weighty=1.0;

您可能还想设置一些值来锚定和填充。

锚点和填充的默认值在大多数情况下都可以很好地工作,但是它们对于进一步自定义每个组件的行为很有用。例如,如果您希望 JTextField 尽可能宽 c.fill=GridBagConstraints.HORIZONTAL,或者如果您希望它接触右边距而不是左边距 c.anchor=GridBagConstraints.LINE_END...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2014-02-23
    • 2013-08-22
    • 2014-02-19
    相关资源
    最近更新 更多