Получение JFrame для содержания JPanel - PullRequest
0 голосов
/ 04 октября 2011

У меня есть JFrame, в который я вставляю JPanel для отображения изображения, в данном случае 1024x1025. Проблема, на которую я не могу найти ответ, заключается в том, как обеспечить, чтобы мой содержащий JFrame отображал все изображение / JPanel. У меня есть что-то близкое к этому примеру:

ImagePanel view = new ImagePanel(); //extends JPanel
JFrame Container = new JFrame();
view.setSize(1024, 1025);
container = new JFrame(winTitle);
container.setLayout(new BorderLayout());
container.setSize(view.getSize());
container.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
container.add(view);
container.setVisible(true);

Проблема с этим, очевидно, заключается в том, что JFrame украшен базовой ОС, поэтому я не знаю, сколько пикселей сделать его больше, чем размер JPanel от системы к системе. Как и сейчас, изображение обрезается справа и снизу с помощью нескольких пикселей, каждый из которых установлен в JFrame с тем же размером, что и JPanel. Есть ли способ сказать JFrame прочитать размер Jpanel, который он содержит, и сделать его достаточно большим, чтобы отобразить весь JPanel? Спасибо!

EDIT

Установка предпочтительного размера на панелях изображений, затем установка размера (не предпочтительно) для контейнера, затем упаковка после добавления дает мне поведение, которое я хотел. Может кто-нибудь объяснить, что здесь происходит, я все еще немного нечетко по порядку операций с некоторыми компонентами колебания.

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

Вы должны добавить панель изображений в область содержимого JFrame. И вы должны просто использовать pack() на кадре, чтобы он принял соответствующий размер. Это займет размер, необходимый для размещения предпочтительного размера его компонентов.

0 голосов
/ 04 октября 2011

Если вы уверены в разрешении изображения, используйте setPreferredSize(new Dimension(1024, 1025)) для JFrame, а также для JPanel. Поскольку JFrame по умолчанию использует BorderLayout, вам не нужно указывать container.setLayout(new BorderLayout());.

0 голосов
/ 04 октября 2011

После container.add() и до container.setVisible() добавьте container.pack().

РЕДАКТИРОВАТЬ: Вы также можете использовать Box.createVerticalStrut(int) и Box.createHorizontalStrut(int) в одной из сторон вашего BorderLayout. Это должно заставить макет оставить место для изображения.

...