Метод pack
должен вызываться после добавления всех компонентов в кадр. И метод setLocationRelativeTo
должен вызываться после pack
/ setSize
.
Другая проблема: lblPassword.setPreferredSize(new Dimension(10, 0));
. Эта строка не имеет смысла.
И последняя: не смешивайте компоненты AWT и Swing. Используйте JTextField
вместо TextField
Вот ваш пример, исправленный мной.
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.TextField;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
/**
* <code>Window</code>.
*/
public class Window extends JFrame {
public Window() {
setTitle("Login");
JLabel lblUser = new JLabel("User:");
lblUser.setPreferredSize(new Dimension(10, 0));
lblUser.setHorizontalAlignment(SwingConstants.RIGHT);
JTextField txtUser = new JTextField(10);
JLabel lblPassword = new JLabel("Password:");
lblPassword.setHorizontalAlignment(SwingConstants.RIGHT);
TextField txtPassword = new TextField(10);
JPanel pnlData = new JPanel(new GridLayout(2, 2, 5, 5));
Border titleBorder = new TitledBorder("Login");
pnlData.setBorder(titleBorder);
pnlData.add(lblUser);
pnlData.add(txtUser);
pnlData.add(lblPassword);
pnlData.add(txtPassword);
JButton jbtOk = new JButton("OK");
JButton jbtCancel = new JButton("Cancel");
JPanel pnlButton = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
pnlButton.add(jbtOk);
pnlButton.add(jbtCancel);
Box boxOutter = Box.createVerticalBox();
boxOutter.add(pnlData);
boxOutter.add(pnlButton);
add(boxOutter);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(Window::new);
}
}