Почему мой BoxLayout неправильно упорядочивает элементы?

Я новичок в использовании компонентов свинга и jframe в java, и я работаю над созданием консоли для игры. Я пытаюсь выровнять элементы консоли следующим образом:

_______________________________
|    _____________________    |
|    |                   |    |
|    |       Output      |    |
|    |___________________|    |
|                             |
|           _______           |
|          |_Input_|          |
|_____________________________|

Моя текущая программа, показанная ниже, отображает поля ввода и вывода рядом друг с другом, а не друг над другом и под ним.

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

public class GUI{

    public static void main(String[] args) {
        SwingUtilities.invokeLater(GUI::startUp); 
    }

    private static void startUp() {
        JFrame frame = new JFrame("AoA");
        frame.setLayout(new BoxLayout(frame, BoxLayout.Y_AXIS));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1020,760);
        frame.setBackground(Color.LIGHT_GRAY);
        frame.setResizable(false);
        frame.setLayout(new FlowLayout());

        JTextArea jta = new JTextArea(30,60);
        jta.setEditable(false);
        jta.setBackground(Color.WHITE);
        frame.add(new JScrollPane(jta));

        JTextField jta2 = new JTextField();
        jta2.setPreferredSize(new Dimension(200,70));
        jta2.setHorizontalAlignment((int) JTextField.CENTER_ALIGNMENT);
        frame.add(new JScrollPane(jta2));
        frame.setVisible(true);

        jta.append("Test");

    }
}

Как я могу настроить выравнивание этих компонентов так, чтобы они соответствовали предполагаемому результату?


person Tyler B    schedule 01.02.2020    source источник
comment
На самом деле вы добавляете BoxLayout не в JFrame, а в его contentPane, и это следует отметить в конструкторе макета: new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)   -  person Hovercraft Full Of Eels    schedule 02.02.2020
comment
Сначала вы устанавливаете макет в BoxLayout. Затем через несколько утверждений вы меняете его на FlowLayout. Прочтите руководство по Swing, посвященное Как использовать BoxLayout для рабочий пример, демонстрирующий, как правильно его использовать.   -  person camickr    schedule 02.02.2020
comment
Вам также следует избегать использования setPreferredSize. В случае JTextField вы можете указать количество видимых столбцов в качестве ориентира   -  person MadProgrammer    schedule 02.02.2020
comment
Согласен с @camickr. Как это frame.setLayout(new FlowLayout()); имеет смысл?   -  person Hovercraft Full Of Eels    schedule 02.02.2020
comment
О, я совсем забыл про этот flowLayout. Элементы теперь расположены правильно, но их размеры неверны. Они оба занимают столько экрана, сколько могут.   -  person Tyler B    schedule 02.02.2020
comment
но их размеры неверны. - прочтите руководство! BoxLayout будет увеличивать компоненты до их максимального размера, если доступно дополнительное пространство. Вместо установки размера фрейма используйте метод pack() после добавления компонентов в фрейм. Или другим подходом было бы сохранить значение BorderLayout по умолчанию. Добавьте свою текстовую область в JScrollPane и добавьте панель прокрутки в ЦЕНТР BorderLayout. Затем создайте JPanel и добавьте JTextField на панель. Затем добавьте панель в BorderLayout.PAGE_END фрейма.   -  person camickr    schedule 02.02.2020
comment
@camickr Хорошо, я попробую. Благодарю вас!   -  person Tyler B    schedule 02.02.2020