Когда страница была проанализирована, вам нужно подождать, пока все изображения загрузятся, прежде чем выложить компонент.
Перехватить загрузку всех изображений, чтобы убедиться, что все изображения полностью загружены, прежде чем выложить компонент.Я сделал это, переопределив HtmlDocumentImpl.loadImage.(Пришлось создать подкласс DocumentBuilderImpl и переопределить createDocument, чтобы заставить его работать.) Я использовал семафор, чтобы дождаться, пока не станет доступен результат image.getWItdh.
Мне пришлось настроить таймер при разборе, так как некоторыесценарии могут зацикливаться и никогда не возвращаться.Я понятия не имею, есть ли лучший способ решить эту проблему.
Что касается компоновки, существует множество грузовых экспериментов и экспериментов, которые приводят к приведенному ниже фрагменту, так что, возможно, вы можете попытаться удалить некоторые вещи.
htmlPanel.setVisible(true);
htmlPanel.setPreferredWidth(DEFAULT_PAGE_WIDTH);
logger.info("Calculating preferred size");
// Get the preferred heigth for the current width.
Dimension psvz = htmlPanel.getPreferredSize();
Dimension min = htmlPanel.getMinimumSize();
logger.info("prf :" + psvz);
logger.info("min :" + min);
// Enlarge to the minimum width (with a limit)
int width = Math.min(MAX_PAGE_WIDTH, Math.max(DEFAULT_PAGE_WIDTH,
psvz.width));
int height = psvz.height;
logger.info("width :" + width);
logger.info("heigth :" + height);
htmlPanel.setSize(width, height);
// actually, htmlPanel is a subclass, and this method exposes validateTree. It may work without it.
htmlPanel.forceValidateTree();
htmlPanel.doLayout();
setImageSize(width);
logger.info("actual size:" + htmlPanel.getSize());
Я не мог понять, что JFrame делает с HtmlPanel, чтобы он правильно рисовал своих детей.Мне пришлось рисовать, используя компонент детей;Т.е. либо htmlPanel.getBlockRenderable (), либо frameset.
Изображения закрашиваются асинхронно (и краски могут прерваться), поэтому перед использованием BufferedImage все изображения должны быть завершены.
Я использовал делегирующий объект graphics2d, переопределяющий все методы рисования изображения, чтобы дождаться завершения рисования.
После этого я обнаружил, что HTML-код может выиграть от изменения макета, поскольку все размеры изображений известныпоэтому я лишаю законной силы компонент и снова выполняю макет и рисование (или на самом деле, я просто вызываю код дважды ...)
После этого можно использовать BufferedImage.Может быть, есть более простой способ.