Читать размер JFrame из JPanel - PullRequest
       21

Читать размер JFrame из JPanel

1 голос
/ 20 сентября 2011

У меня есть класс Layout, который расширяет JFrame.Позже я добавляю RoadPanel, который расширяет JPanel.Во время выполнения можно узнать Layout размер кадра в RoadPanel?

Код

class Layout extends JFrame{
    ...Something...
    RoadPanel rp = new RoadPanel();
    this.add(rp);
}

class RoadPanel extends JPanel{
    ...graphics and components...
}

Оба реализованы в разных классах.

До сих пор я пытался отправить размер кадра в конструктор RoadPanel.Да, это так неубедительно, что отправит только один раз во время инициации.: (

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

Почему я хочу это сделать?Это потому что ...

Цель знать размер кадра - уменьшить мои Линии и Дуги RoadPanel :) Но я не хотел увеличивать масштаб.Так что теперь я могу проверить, меньше ли размер кадра, чем мой path.getBounds2D, чем перерисовать все линии и дуги и вписаться в видимую область.Но когда вы увеличиваете размер кадра, чертеж RoadPanel должен оставаться таким же, и его можно увеличивать вручную, используя кнопку масштабирования.

Специальный указатель на ответ Эндрю Томпсона, для лучшей практики.

Ответы [ 3 ]

4 голосов
/ 20 сентября 2011

.. можно ли узнать размер кадра Layout в RoadPanel?

Использовать макет (или макеты). Тогда не нужно будет знать размер родительского контейнера.

Подробнее см. Компоновка компонентов в контейнере .

Обновление 1

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

Макеты обновят размеры и позиции компонентов автоматически. Для пользовательской живописи просто позвоните Container.getSize() во время paintComponent().

Обновление 2

Однако цель знать размер кадра - уменьшить мои Линии и Дуги RoadPanel

В случае, если я не был достаточно ясен выше: Для пользовательской рисования просто позвоните Container.getSize() во время paintComponent(). В этом случае Container будет RoadPanel. Между прочим, это будет работать правильно независимо от:

  • RoadPanel с Border.
  • Не входит в Frame или не является корневым компонентом.
1 голос
/ 20 сентября 2011

С RoadPanel попробуй:

this.getParent().getSize();
1 голос
/ 20 сентября 2011

Вы можете либо передать сам фрейм конструктору панели, а затем запросить размер, либо вы можете использовать getParent(), который должен вернуть прямого родителя панели.В этом случае может понадобиться двигаться дальше вверх по иерархии, пока не дойдете до фрейма.

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

...