Java 调整 JFrame 大小或最大化时如何将 JPanel 居中?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21058565/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 06:16:04  来源:igfitidea点击:

How to center JPanel when JFrame is resized or maximized?

javaswingjframejpanel

提问by Rohan21

I want my JPanelto be still in the center when I maximize or re-size the JFrame. How can I do that?

我想我JPanel到现在还处于中心时,我最大化或重新大小的JFrame。我怎样才能做到这一点?

Tried:

尝试:

  jframe.add(panel, BorderLayout.CENTER);
     panel.setAlignmentX(JComponent.CENTER_ALIGNMENT);

But it doesn't work.

但它不起作用。

Here is my other code:

这是我的其他代码:

public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    login frame = new login();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public login() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
        setVisible(true);
        setBounds(5, 5, 409, 267);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(0, 128, 128));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
            contentPane.setLayout(null);

        panel = new JPanel();
        panel.setBounds(57, 42, 292, 167);
        panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Login", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 255)));
        panel.setLayout(null);
        contentPane.add(panel);

        textField = new JTextField();
        textField.setBounds(71, 35, 192, 26);
        panel.add(textField);
        textField.setColumns(10);

        passwordField = new JPasswordField();
        passwordField.setBounds(71, 72, 192, 26);
        panel.add(passwordField);

        JLabel lblNewLabel = new JLabel("Username:");
        lblNewLabel.setBounds(6, 41, 68, 14);
        panel.add(lblNewLabel);

        JLabel lblNewLabel_1 = new JLabel("Password:");
        lblNewLabel_1.setBounds(6, 78, 68, 14);
        panel.add(lblNewLabel_1);

        JButton btnNewButton = new JButton("Login");
        btnNewButton.setBounds(71, 120, 89, 23);
        panel.add(btnNewButton);



        JButton btnNewButton_1 = new JButton("Cancel");
        btnNewButton_1.setBounds(174, 120, 89, 23);
        panel.add(btnNewButton_1);

How will I do that here?

我将如何在这里做到这一点?

enter image description here

在此处输入图片说明

enter image description here

在此处输入图片说明

采纳答案by MadProgrammer

You could simply use GridBagLayouton the parent container. It lays all it's components out around the center of the container.

您可以简单地GridBagLayout在父容器上使用。它将所有组件放在容器的中心周围。

NormalMax

普通的最大限度

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

public class CenterComponent {

    public static void main(String[] args) {
        new CenterComponent();
    }

    public CenterComponent() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel content = new JPanel(new GridBagLayout());
                content.setBackground(Color.GREEN);
                content.setBorder(new EmptyBorder(20, 20, 20, 20));
                frame.setContentPane(content);
                frame.add(new LoginPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class LoginPane extends JPanel {

        public LoginPane() {
            setLayout(new GridBagLayout());
            setBorder(new TitledBorder("Login"));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            add(new JLabel("Username:"), gbc);
            gbc.gridy++;
            add(new JLabel("Password:"), gbc);

            gbc.gridx++;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;
            add(new JTextField(10), gbc);
            gbc.gridy++;
            add(new JTextField(10), gbc);

            gbc.gridx = 1;
            gbc.gridy++;
            gbc.gridwidth = 1;
            gbc.weightx = 0;
            gbc.fill = GridBagConstraints.NONE;
            add(new JButton("Login"), gbc);
            gbc.gridx++;
            add(new JButton("Cancel"), gbc);
        }

    }

}

回答by Kevin Workman

Don't use a null layout. You can do this with a BoxLayout or a GridLayout, depending on the behavior you want. Check the tutorials for more info: http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

不要使用空布局。您可以使用 BoxLayout 或 GridLayout 来执行此操作,具体取决于您想要的行为。查看教程以获取更多信息:http: //docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

回答by ravibagul91

Replace

代替

panel.setLayout(null);

By

经过

panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));

OR

或者

panel.setLayout(new GridLayout(3,1, 5, 5));