Зачем упаковать () уменьшить рамку? - PullRequest
1 голос
/ 17 октября 2019

Я написал окно входа в систему, и если бы я использовал setBounds (), чтобы определить размер фрейма, все компоненты видимы. Но при использовании pack () рамка уменьшается до минимальной, и никакой компонент для отображения не отображается.

public class Window extends JFrame {
    public Window() {
        setTitle("Login");
        setLocationRelativeTo(null);
        setSize(new Dimension(200, 130));
        pack(); // it make the frame shrink to the minimal
        JLabel lblUser = new JLabel("User:");
        lblUser.setPreferredSize(new Dimension(10, 0));
        lblUser.setHorizontalAlignment(SwingConstants.RIGHT);
        TextField txtUser = new TextField(10);
        JLabel lblPassword = new JLabel("Password:");
        lblPassword.setPreferredSize(new Dimension(10, 0));
        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(CENTER, 10, 0));
        pnlButton.add(jbtOk);
        pnlButton.add(jbtCancel);
        Box boxOutter = Box.createVerticalBox();
        boxOutter.add(pnlData);
        boxOutter.add(pnlButton);
        add(boxOutter);
        setVisible(true);
    }
}

1 Ответ

1 голос
/ 17 октября 2019

Метод 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);
    }
}
...