MigLayout,将所有组件对齐JFrame

时间:2015-06-13 15:40:39

标签: java swing miglayout

如何在JFrame中心的JPanel处对齐我的组件。

以下是我的代码和我得到的内容

a busy cat

我想要这样

a busy cat

大型机

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame {


private static MainFrame instance = new MainFrame();

public static MainFrame getInstance() {
    return instance;
}

public static void switchToPanel(JPanel p) {
    getInstance().setContentPane(p);
    getInstance().validate();
}

private MainFrame() {
    setTitle("FavMovies");
    setSize(400, 400);
    setLocationRelativeTo(null);
    setVisible(true);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {
    MainFrame.switchToPanel(new LoginPanel());
}
}

LoginPanel

import javax.swing.*;
import net.miginfocom.swing.MigLayout;



public class LoginPanel extends JPanel {

// PROPERTIES

private JTextField inputUsername;
private JPasswordField inputPassword;

// CONSTRUCTOR

public LoginPanel() {

    setSize(400,400);

    // COMPONENTS

    inputUsername = new JTextField(10);
    inputPassword = new JPasswordField(10);
    JButton loginButton = new JButton("Login");
    JButton createButton = new JButton( "Create User");

    setLayout(new MigLayout());

    // first row
    add(new JLabel( "Username: "));
    add(inputUsername, "wrap 5");

    // second row
    add(new JLabel( "Password: "));
    add(inputPassword, "wrap 10");

    // final row        
    add(loginButton);
    add(createButton); 


}

}

我希望我能解释一下:(我希望我能解释一下:(我希望我能解释一下:(我希望我能解释一下:(

2 个答案:

答案 0 :(得分:1)

GridBagLayout会自动居中组件。因此,设置框架的布局以使用GridBagLayout,然后只需将登录面板添加到框架中:

//getInstance().setContentPane(p);
getInstance().setLayout( new GridBagLayout() );
getInstance().add(p);

编辑:

  

但是,当我调整大小时,我能够看到loginPanel处于中心位置。

看起来您正在向可见的GUI添加组件。因此,您需要手动调用布局管理器并重新绘制组件。

getInstance().validate();
getInstance().revalidate();
getInstance().repaint();

代码的结构非常复杂。您应该阅读Swing教程以获得更好的示例,您将不会遇到此问题。也许从How to Use LabelsLabelDemo开始。

如果您需要交换面板的功能,请查看专为此目的而设计的How to Use CardLayout上的Swing教程中的部分。

答案 1 :(得分:1)

我认为没有理由使用GridBagLayout。实现这是一件微不足道的事情 在MigLayout

package com.zetcode;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;

/*
Centering components in MigLayout manager.
Author: Jan Bodnar
Website: zetcode.com
 */
public class MigLayoutMoviesEx extends JFrame {

    public MigLayoutMoviesEx() {

        initUI();
    }

    private void initUI() {

        JLabel lbl1 = new JLabel("User name");
        JLabel lbl2 = new JLabel("Password:");

        JTextField field1 = new JTextField(10);
        JTextField field2 = new JTextField(10);

        JButton btn1 = new JButton("Login");
        JButton btn2 = new JButton("Create user");

        createLayout(lbl1, field1, lbl2, field2, btn1, btn2);

        setTitle("MigLayout example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout("align 50% 50%"));

        add(arg[0]);
        add(arg[1], "wrap");
        add(arg[2]);
        add(arg[3], "wrap");
        add(arg[4]);
        add(arg[5]);

        pack();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            MigLayoutMoviesEx ex = new MigLayoutMoviesEx();
            ex.setVisible(true);
        });
    }
}

为了使组件居中,我们使用align 50% 50%约束。

以下是截图:

Screenshot of the code example