JScrollPane и printAll () - PullRequest
       5

JScrollPane и printAll ()

1 голос
/ 04 марта 2012

Я работаю над расширением 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).

Using a JList directly Using a JList wrapped in a JScrollPane

Я не смог найти ни одногомагия внутри кода JScrollPane, связанная с рисованием его видовых экранов.Может быть, нужно что-то инициализировать, что сделает Swing, но я забыл.Можно ли как-нибудь отобразить эти окна?

Ответы [ 2 ]

1 голос
/ 10 апреля 2012

См. Почему заголовок JTable не отображается на изображении? , где приведены общие советы по визуализации компонентов в изображениях. Попробуйте вызвать комбинации validate(), addNotify() & doLayout(), как указано в коде этого потока.

1 голос
/ 04 марта 2012

не уверен из вашего вопроса

1) если есть около JScrollPane или JViewport, потому что JViewport только (из JScrollPane) только о видимом Rectangle на экране,

2) каждый JComponent возвращает Graphics2D

3) пожалуйста, почему вы звоните doLayout() / addNotify(), если все события для Swing GUI выполняются на EDT, или есть какие-то события, основанные на Swing Timer

4) лучше бы отредактировать ваш вопрос с помощью SSCCE , который генерировал нежелательный вывод в GUI

5) для JViewport вы должны создать и переопределить свой RepaintManager

6) возможно глупый вопрос, пожалуйста, убедитесь, что у JComponent нет анимации, что означает перемещение по JScrollPane и остановку на EDT к Thread.sleep(int)

РЕДАКТИРОВАТЬ (может быть наиболее важным)

7) для OpenGL необходимо реализовать Components на основе Java AWT

...