Другое размещение полей каждый раз, когда я запускаю код - PullRequest
0 голосов
/ 25 января 2019

Я застрял с моим заявлением.Каждый раз, когда я запускаю свой код, мои поля, например, fromTextField, когда-то имеют ширину 180, в противном случае моя ширина private static final Integer widthField = 232.


Код:


package gui;

import javax.swing.*;
import java.awt.*;

public class MailGui extends JFrame {
    private static final Integer widthField = 232;

private MailGui() {
        JPanel northPanel = new JPanel();
        northPanel.setLayout(new GridLayout(5, 5));

        JLabel fromLabel = new JLabel("From: ", SwingConstants.LEFT);
        JLabel passwdLabel = new JLabel("Password: ", SwingConstants.LEFT);
        JLabel toLabel = new JLabel("To: ", SwingConstants.LEFT);
        JLabel subjectLabel = new JLabel("Subject: ", SwingConstants.LEFT);
        JLabel textLabel = new JLabel("Content: ", SwingConstants.LEFT);

        JTextField fromTextField = new JTextField();

        JTextField toTextField = new JTextField();
        JPasswordField passwdPasswordField = new JPasswordField();
        JTextField subjectTextField = new JTextField();
        JTextArea textArea = new JTextArea(8, 30);

        JButton sendButton = new JButton("Send");

        textArea.setLineWrap(true);

        northPanel.add(fromLabel);
        northPanel.add(fromTextField);

        northPanel.add(passwdLabel);
        northPanel.add(passwdPasswordField);

        northPanel.add(toLabel);
        northPanel.add(toTextField);

        northPanel.add(subjectLabel);
        northPanel.add(subjectTextField);

        northPanel.add(textLabel);
        northPanel.add(textArea);

        this.add(northPanel, BorderLayout.NORTH);

        JScrollPane scrollPane = new JScrollPane(textArea);
        this.add(scrollPane, BorderLayout.CENTER);

        JPanel southPanel = new JPanel();
        southPanel.add(sendButton);

        add(southPanel, BorderLayout.SOUTH);

        this.pack();

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setResizable(false);


        fromTextField.setBounds(textArea.getX() + 100, 0, widthField, 19);
        passwdPasswordField.setBounds(textArea.getX() + 100, 19, widthField, 19);
        toTextField.setBounds(textArea.getX() + 100, 38, widthField, 19);
        subjectTextField.setBounds(textArea.getX() + 100, 57, widthField,         19);

    }

    public static void main(String[] args) {
        new MailGui();
    }
}

Что у меня есть:


First


Или


Second


Что я кроме:


Second


Спасибо за любую помощь.Q.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вызов метода setBounds () ничего не делает.Менеджер по расположению переопределит размер / местоположение в соответствии с правилами менеджера по расположению.В случае GridLayout все компоненты будут иметь размер, соответствующий предпочтительному размеру самого большого компонента, или по мере изменения размера кадра каждая ячейка будет корректироваться для заполнения пространства, доступного в кадре.

При создании JTextFieldкод должен выглядеть примерно так:

JTextField textField = new JTextField(15);

Это позволит текстовому полю определять свой собственный предпочтительный размер для отображения 15 символов W на основе шрифта текстового поля.

Тогда менеджер раскладки сможет лучше определить размер каждого компонента

Если вы хотите, чтобы ширины надписей и текстовых полей были разными, вам нужно использовать другой менеджер раскладки.Вероятно, GridBagLayout.Прочитайте учебник Swing по Как использовать GridBagLayout для получения дополнительной информации и примеров.

Обратите внимание, что в примерах учебника показано, как создать графический интерфейс в потоке диспетчеризации событий (EDT).

0 голосов
/ 25 января 2019

Позвоните pack() в конце композиции GUI, чтобы один раз расположить ее определенным образом.

Зависимость геометрии от textArea вызывает сожаление. Поместите это в макет тоже.

Есть хорошие графические редакторы с более сложными менеджерами компоновки.

...