Swing: об изменении размера JFrames и условной прокрутке - PullRequest
0 голосов
/ 29 марта 2012

У меня есть JFrame с одним JPanel внутри.На панели отображаются изображения, полученные из сети во время выполнения.Эти изображения обычно большие, но могут иметь любой размер.Учитывая это и учитывая, что в будущем я могу добавить строку меню к кадру, я хотел бы сделать следующее:

  • Для каждого полученного изображения размер панели изменяется до ее точного размера.
  • Если изображение (и, следовательно, панель с измененным размером) превышает определенное максимальное значение по ширине или высоте (например, размер экрана - 100 пикселей), то размер кадра должен измениться до максимально допустимого значения и включить полосы прокрутки.
  • В противном случае рамка должна регулировать свой размер, чтобы отображать всю панель без каких-либо отступов.Таким образом, размер фрейма - это размер панели содержимого плюс границы и строка заголовка (и строка меню, если я, наконец, добавлю его).

Есть ли способ сделать это?Если нет, то какова будет лучшая альтернатива?

Заранее спасибо

РЕДАКТИРОВАТЬ:

Подводя итог, можно сказать, , как изменить размер родительского фрейма донастроить его дочернюю панель содержимого .Это противоположно тому, что делает большинство людей (изменяйте размер панели в соответствии с рамкой).

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

1 Ответ

2 голосов
/ 29 марта 2012
  • помещать изображения в качестве значка в JLabel вместо рисования изображения в JPanel

  • Вы можете уменьшить размер пикселя изображения перед отображением в графическом интерфейсе с помощью
    Изображение # getScaledInstance (int ширина, int высота, int подсказки)

  • обратите внимание, что вы должны закрывать InputStream по центру в блоке finally, в противном случае эти Objects остаются в памяти до OutOfMemoryError блокировка текущего экземпляра JVM

РЕДАКТИРОВАТЬ

put images as Icon to the JLabel

но

pictures = new ImageIcon("Xxxxx");
pictures.getImage().flush();
myLabel.setIcon(pictures);
  • этот код лучше вызывать с SwingWorker или с Runnable#Thread, но в этом случае вам нужно заключить строку кода myLabel.setIcon(pictures); в invokeLater(),

  • подробнее о SwingWorker и invokeLater() в учебнике Concurency в Swing, куча ответов о параллелизме на этом форуме

...