Найти «реальную» высоту / ширину объекта Swing / AWT - PullRequest
8 голосов
/ 17 октября 2008

Поскольку Canvas3D не имеет возможности динамического изменения размера с родительским фреймом, я хотел бы иметь возможность отслеживать, когда пользователь изменяет размер окна, а затем сам изменять его размер вручную. (Если это приведет к сбою Canvas3D, как предлагают некоторые документы, я просто уничтожу и воссоздаю его, когда пользователь изменит размер своего окна). Часть этой процедуры заключается в том, чтобы точно определить, с какого размера панель контейнера должна начинаться.

Два метода, которые я пробовал:

panel.getHeight();
panel.getPreferredSize().height;

Похоже, что нет точного отчета о вещах: getHeight() неизменно равен нулю, а getPreferredSize() возвращает числа, которые на самом деле не имеют никакого отношения к фактическому размеру панели.

Есть идеи?

Редактировать : Итак, я взял отладчик для объекта панели и вручную проверил свойства не-объекта, и я не увидел ничего похожего по ширине / высоте. Конечно, есть подобъекты, на которые я не смотрел. Кроме того, возможно, окно должно быть видимым (это не так, в точке, в которой я взаимодействую с объектом), когда я запрашиваю высоту / объект?

Редактировать 2 : Итак, классы Swing являются подклассами классов AWT, поэтому я думаю, что если вы сможете найти их высоту / ширину, подход будет обобщен. Я изменил название соответственно.

Ответы [ 2 ]

20 голосов
/ 17 октября 2008

Чтобы определить размер компонента, вам необходимо:

  • установили его вручную в какой-то момент
  • запустить диспетчер компоновки, отвечающий за компоновку компонента

Как правило, вы получаете точный размер компонента с помощью метода getSize (), который возвращает объект Dimension, содержащий ширину и высоту, но getWidth / Height () также должна работать. Но это может сработать, только если выполнено одно из двух предварительных условий. Если окно никогда не делалось видимым, не имеет менеджера компоновки или компонент (вы хотите знать размер) был добавлен после того, как окно / контейнер стало видимым, размер обычно равен нулю.

Таким образом, чтобы получить правильный размер, вы должны сделать контейнер / фрейм видимым (после добавления компонента) или вызвать validate () или doLayout () для контейнера, чтобы пересчитать компоновку, если вы добавили компонент после последний макет был сделан. Еще одна вещь, которую нужно иметь в виду, это настройка и, возможно, настройка менеджера компоновки на контейнере. Если менеджер макета не установлен (null), то даже если сделать контейнер видимым, или вызов validate () не устанавливает размер для его дочерних элементов.

Свойства минимума / предпочтительного размера / максимумаSize являются подсказками для менеджера макета, того, как компонент должен иметь размеры, но он не должен подчиняться им (большинство менеджеров макета этого не делают).

Редактировать 2: После прочтения вашего другого вопроса по той же теме, я думаю, вам следует прочитать Использование менеджеров по макету из Учебников по Java

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

public class WindowResizeTest extends JFrame {

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

    public WindowResizeTest() {
        this.setSize(640, 480);

        JPanel panel = new JPanel();
        panel.setBackground(Color.RED);
        this.add(panel);

        this.addComponentListener(new ComponentListener() {

            public void componentResized(ComponentEvent e) {
                System.out.println(e.getComponent().getSize());
            }

            public void componentHidden(ComponentEvent e) {}

            public void componentMoved(ComponentEvent e) {}

            public void componentShown(ComponentEvent e) {}
        });

        this.setVisible(true);
    }

}
1 голос
/ 29 июня 2012

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

int windowWidth = getWidth();
int windowHeight = getHeight();

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

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