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
How to center JPanel when JFrame is resized or maximized?
提问by Rohan21
I want my JPanel
to 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?
我将如何在这里做到这一点?
采纳答案by MadProgrammer
You could simply use GridBagLayout
on the parent container. It lays all it's components out around the center of the container.
您可以简单地GridBagLayout
在父容器上使用。它将所有组件放在容器的中心周围。
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));