Я работаю над расширением JPanel, которое предназначено только для рендеринга его содержимого в BufferedImage, которое я затем использую в качестве текстуры для рендеринга в OpenGL.Для этого я создаю свое специальное расширение JPanel с менеджером раскладки и т. Д., Как если бы я строил обычный графический интерфейс Swing.
Чтобы отобразить его на изображении, я должен вызвать doLayout
сначала, а затем я использую метод printAll(java.awt.Graphics)
, чтобы напечатать его и добавленные компоненты:
Graphics2D g = image.createGraphics();
printAll(g);
Само свинг (EDT, RepaintManager и т. д.) никогда не задействуется, я просто создаю компоненты (вне любого окна илиframe) и напрямую используйте printAll.
Это работает очень хорошо для большинства «элементарных» компонентов (таких как кнопки, метки, списки), но я столкнулся с проблемой с JScrollPane.Что бы я ни пытался, JScrollPane никогда не закрасит свои видовые окна (основной видовой экран и полосы прокрутки) в заданную Графику, но только ее границу, и даже ручной вызов printAll
в видовых экранах не даст результата.приложил два скриншота, которые показывают «до и после» простого графического интерфейса, состоящего из JList и JButton.На первом изображении я использую необработанный JList, на втором изображении я обернул его в JScrollPane, используя new JScrollPane(list)
.
Я не смог найти ни одногомагия внутри кода JScrollPane, связанная с рисованием его видовых экранов.Может быть, нужно что-то инициализировать, что сделает Swing, но я забыл.Можно ли как-нибудь отобразить эти окна?