MigLayout,将所有组件对齐到 JFrame 的中心
MigLayout, aligning all components at center of JFrame
如何在 JFrame 的中心对齐 JPanel 中的组件。
这是我的代码和我得到的
我要这样
(来源:hizliresim.com)
MainFrame
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());
}
}
登录面板
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);
}
}
我希望我能解释:(我希望我能解释:(我希望我能解释:(我希望我能解释:(
GridBagLayout
将自动居中组件。因此,将框架的布局设置为使用 GridBagLayout
,然后将您的登录面板添加到框架中:
//getInstance().setContentPane(p);
getInstance().setLayout( new GridBagLayout() );
getInstance().add(p);
编辑:
However, when i resize it, i was able to see loginPanel at center.
看起来您正在向可见的 GUI 添加组件。所以你需要手动调用布局管理器并重新绘制组件。
getInstance().validate();
getInstance().revalidate();
getInstance().repaint();
你的代码结构真的很复杂。您应该阅读 Swing 教程以获得更好的示例,并且您不会遇到这个问题。也许从 How to Use Labels 的 LabelDemo
开始。
如果您需要交换面板的功能,请查看 How to Use CardLayout
上的 Swing 教程中专为此目的设计的部分。
我认为没有理由使用 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%
约束。
截图如下:
如何在 JFrame 的中心对齐 JPanel 中的组件。
这是我的代码和我得到的
我要这样
(来源:hizliresim.com)
MainFrame
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());
}
}
登录面板
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);
}
}
我希望我能解释:(我希望我能解释:(我希望我能解释:(我希望我能解释:(
GridBagLayout
将自动居中组件。因此,将框架的布局设置为使用 GridBagLayout
,然后将您的登录面板添加到框架中:
//getInstance().setContentPane(p);
getInstance().setLayout( new GridBagLayout() );
getInstance().add(p);
编辑:
However, when i resize it, i was able to see loginPanel at center.
看起来您正在向可见的 GUI 添加组件。所以你需要手动调用布局管理器并重新绘制组件。
getInstance().validate();
getInstance().revalidate();
getInstance().repaint();
你的代码结构真的很复杂。您应该阅读 Swing 教程以获得更好的示例,并且您不会遇到这个问题。也许从 How to Use Labels 的 LabelDemo
开始。
如果您需要交换面板的功能,请查看 How to Use CardLayout
上的 Swing 教程中专为此目的设计的部分。
我认为没有理由使用 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%
约束。
截图如下: