Почему Java pack не правильно определяет размер кадра, когда textarea используется с другими компонентами? - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю GUI, используя GridLayout, чтобы упорядочить несколько панелей, использующих FlowLayout. Я использую пакет, чтобы определить размер кадра. Если у меня есть только TextArea, то он имеет размеры правильно. Если у меня есть только другие компоненты, это правильно размеры. Но если я использую оба кода p1 и p2 в коде ниже, панель с кнопками не имеет нужного размера. Я использую тестовый код ниже. Если я использую только p1 или p2, это правильно, но не с обоими размерами: вот изображение, которое я получаю. Я не хочу все это дополнительное пространство между кнопками и текстовой областью. Если я делаю только одну текстовую область, она имеет размеры правильно: enter image description here

public class GUIPractice extends JFrame
{
    //declare GUI objects
    JPanel panel;
    JPanel p1, p2;
    JButton btnAdd, btnShow;
    JScrollPane js;
    JTextArea taOutput; 

    //constructor
    public GUIPractice()
    {
        //give frame a title
        setTitle("GUI Practice");
        panel =new JPanel(new GridLayout(0, 1));
        btnAdd = new JButton("Add");
        btnShow = new JButton("Show");
        taOutput = new JTextArea(10, 20);
        js = new JScrollPane(taOutput, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        p1 = new JPanel();
        p1.add(btnAdd);
        p1.add(btnShow);

        p2 = new JPanel();
        p2.add(js);

        panel.add(p1);
        panel.add(p2);

        //add the panel to the frame
        add(panel);
    }

    public static void main(String[] args) 
    {
        GUIPractice frame = new GUIPractice();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

}

1 Ответ

0 голосов
/ 23 апреля 2020

Размеры правильно. GridLayout означает, что все ячейки будут одинакового размера. Поскольку текстовая область больше кнопок, на панели, содержащей кнопки, появляется дополнительное пространство.

Я бы посоветовал вам использовать BorderLayout рамки по умолчанию.

Нет необходимости в вашей «панели», использующей GridLayout.

Вы просто используете:

add(p1, BorderLayout.PAGE_START);
add(p2, BorderLayout.CENTER);

Теперь p1 и p2 будут правильной высоты.

Кроме того, на самом деле нет необходимости в "p2". Вы можете просто добавить панель прокрутки прямо в рамку.

...