当我最大化或重新调整JPanel
的大小时,我希望我的JFrame
仍然位于中心位置。我怎么能这样做?
试过:
jframe.add(panel, BorderLayout.CENTER);
panel.setAlignmentX(JComponent.CENTER_ALIGNMENT);
但它不起作用。
这是我的其他代码:
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);
我将如何在这做?
答案 0 :(得分:7)
您可以在父容器上使用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);
}
}
}
答案 1 :(得分:2)
不要使用null布局。您可以使用BoxLayout或GridLayout执行此操作,具体取决于您所需的行为。查看教程以获取更多信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
答案 2 :(得分:0)
替换
panel.setLayout(null);
通过
panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
OR
panel.setLayout(new GridLayout(3,1, 5, 5));