Менеджер раскладок предпочитаетРазмер Java - PullRequest
6 голосов
/ 13 августа 2011

Я все еще пытаюсь узнать, как работают менеджеры по расположению. Я сделал кадр с двумя JPanels. Первый содержит текстовую область с boxLayout. Второй содержит макет потока с кнопкой.

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

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

public class LayoutMgrTest
{
    public static void main(String[] args)
    {
        TableBasic frame = new TableBasic();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.setVisible(true);


        frame.getContentPane().setLayout(new GridLayout(2,1));

        JPanel controlPane = new JPanel();
        JPanel buttonPane = new JPanel();

        controlPane.setLayout(new BoxLayout(controlPane, BoxLayout.PAGE_AXIS));
        controlPane.setPreferredSize(new Dimension(200, 200));
        controlPane.add(new JScrollPane(new JTextArea()));

        buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT));
        buttonPane.setPreferredSize(new Dimension(100,20));
        buttonPane.add(new JButton("Button1"));
        buttonPane.add(new JButton("Button2"));

        frame.getContentPane().add(controlPane, BorderLayout.NORTH);
        frame.getContentPane().add(buttonPane, BorderLayout.SOUTH);
        frame.setSize(new Dimension(500,500));
        frame.pack();
    }
}

Что бы я ни делал, если я использую сетку, он, кажется, всегда выделяет половину доступного пространства для каждого элемента управления. Мне сказали, что:

Высота каждой строки зависит от высоты каждого компонента. добавлено в каждую строку.

Высота панели кнопок - 20. Она выделяет гораздо больше, чем это:

Wasted space

Что не так с этим кодом?
Я хотел бы оставить эти два JPanels нетронутыми, пожалуйста. Легко просто добавить текстовое поле и кнопки непосредственно к фрейму, но мне нужно сделать это с помощью JPanels (потому что я буду добавлять границы и другие вещи).

Ответы [ 3 ]

7 голосов
/ 13 августа 2011

Это результат использования GridLayout в качестве менеджера по расположению.Измените его на BorderLayout:

frame.getContentPane().setLayout(new BorderLayout());

Например, этот код (я немного изменил оригинал):

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

public class LayoutMgrTest
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        //frame.setVisible(true);   
        //frame.getContentPane().setLayout(new BorderLayout());

        JPanel controlPane = new JPanel();
        JPanel buttonPane = new JPanel();

        controlPane.setLayout(new BoxLayout(controlPane, BoxLayout.PAGE_AXIS));
        controlPane.setPreferredSize(new Dimension(200, 200));
        controlPane.add(new JScrollPane(new JTextArea()));

        buttonPane.setLayout(new FlowLayout(FlowLayout.LEFT));
        buttonPane.setPreferredSize(new Dimension(100,40));
        buttonPane.add(new JButton("Button1"));
        buttonPane.add(new JButton("Button2"));

        frame.add(controlPane, BorderLayout.NORTH);
        frame.add(buttonPane, BorderLayout.SOUTH);
        //frame.setSize(new Dimension(500,500));
        frame.pack();
        frame.setVisible(true);
    }
}

Создает этот кадр:

enter image description here

6 голосов
/ 13 августа 2011

Я соответственно установил предпочитаемый размер каждой панели,

Это еще одна проблема.Вы не должны устанавливать предпочтительный размер.Это работа менеджера по расположению.Просто добавьте свои компоненты на панели и позвольте менеджеру макета выполнять свою работу.

Большинство компонентов имеют предпочтительный размер по умолчанию.Для некоторых вам нужно дать ему небольшой совет.Например, при использовании текстовой области вы можете указать «рекомендуемый» предпочтительный размер, используя:

JTextArea textArea = new JTextArea(rows, columns);
3 голосов
/ 13 августа 2011

Если вы используете LayoutManager, вы не должны устанавливать размер для компонента, кроме фрейма.

размер для компонентов рассчитывается из разных менеджеров компоновки.в коде http://download.oracle.com/javase/tutorial/uiswing/layout/howLayoutWorks.html

вы можете добавить панель с текстовой областью в BorderLayout.CENTER.это должно решить вашу проблему.компонент в BorderLayout.CENTER занимает все пространство, кроме пространства, необходимого для компонентов в СЕВЕР, ВОСТОК, ЮГ и ЗАПАД.

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