Управление размером компонентов в Swing при изменении их размера - PullRequest
3 голосов
/ 10 июня 2009

У меня есть такая простая форма:

Имя пользователя: ..........

Пароль: ..........

При изменении размера формы я бы ожидал, что JTextField (показанный .........) будет изменен по горизонтали, чтобы соответствовать новой ширине, но не по вертикали (такая же высота для JTextField). У нас есть какой-нибудь способ это контролировать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 июня 2009

Чтобы ответить на ваш макет с помощью стандартных менеджеров макетов (кроме GridBag), вложите макеты следующим образом:

BorderLayout
    NORTH=BorderLayout   // keep everything at the top
        WEST=GridLayout(0,1) // the labels
            Label "UserName")
            Label "Password")
        CENTER=GridLayout(0,1) // the fields
            Text Field
            Password Field

Код будет выглядеть примерно так:

JPanel outer = new JPanel(new BorderLayout());
JPanel top = new JPanel(new BorderLayout());
JPanel labels = new JPanel(new GridLayout(0,1,3,3));
JPanel fields = new JPanel(new GridLayout(0,1,3,3));
outer.add(top, BorderLayout.NORTH);
top.add(labels, BorderLayout.WEST);
top.add(fields, BorderLayout.CENTER);
labels.add(new JLabel("Username"));
labels.add(new JLabel("Password"));
fields.add(new JTextField());
fields.add(new JPasswordField());

См. http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/ для моего (очень старого) объяснения того, как вкладывать менеджеры компоновки, как это.

GridBag - воплощение зла; почти невозможно понять, что делает код, если у вас есть более чем несколько компонентов. Чтобы показать, как это будет сделано, хотя:

Insets i = new Insets(0,0,0,0);
p.setLayout(new GridBagLayout());
p.add(new JLabel("Username"), 
  new GridBagConstraints(0, 0, 1, 1, 0, 0, 
    GridBagConstraints.WEST, GridBagConstraints.NONE, i, 0, 0));
p.add(new JLabel("Password"), 
  new GridBagConstraints(0, 1, 1, 1, 0, 1, 
    GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, i, 0, 0));
p.add(new JTextField(), 
  new GridBagConstraints(1, 0, 1, 1, 1, 0, 
    GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, i, 0, 0));
p.add(new JPasswordField(), 
  new GridBagConstraints(1, 1, 1, 1, 1, 1, 
    GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, i, 0, 0));

Это работает, но трудно "увидеть" макет в коде ...

1 голос
/ 10 июня 2009

Один простой способ управления им с помощью одного менеджера макета (для любого использования) будет использовать MigLayout

JPanel panel = new JPanel(new MigLayout());

panel.add(firstNameLabel);
panel.add(firstNameTextField);
panel.add(lastNameLabel,       "gap unrelated");
panel.add(lastNameTextField,   "wrap");
panel.add(addressLabel);
panel.add(addressTextField,    "span, grow");

alt text
(источник: miglayout.com )

1 голос
/ 10 июня 2009

Это зависит от используемого вами менеджера компоновки.

Макет по умолчанию (FlowLayout) не будет изменять размеры компонентов вообще.

Если вы хотите точно контролировать размер ваших компонентов, посмотрите на GridBagLayout.

Самый простой выход - использовать setResizable(false).
Для чего-то такого простого, как окно входа в систему, это, вероятно, тот путь, которым вы хотите.

Если вы заинтересованы в использовании разных макетов, возможно, вы захотите изучить Учебные руководства по Java. У них есть отличный раздел по разметке компонентов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...