У меня странная проблема при попытке экспортировать пользовательские Java JPanels в файл PNG.Процесс экспорта компонентов, которые я писал до сих пор, работал безупречно.
Мои JPanels включают в себя написанные пользователем JComponents (например, переопределите paintComponent (Graphics g) и напишите, что мне нужно).
Процесс экспорта выглядит следующим образом (из расширенного JPanel, который у меня есть):
public void export(File file, int width, int height)
throws IOException
{
Dimension size = getSize();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
draw (g2, new Rectangle (0, 0, width, height));
try {
ImageIO.write(image, "png", file);
} catch (FileNotFoundException e) {
throw new IOException ("Unable to export chart to ("
+ file.getAbsolutePath() + "): " + e.getLocalizedMessage());
} finally {
g2.dispose();
}
}
Приведенный выше метод 'draw ()' вызывает перерисовку всех дочерних компонентов JPanel с использованиемновый размер изображения для экспорта.Работает очень хорошо.
Проблема, с которой я столкнулся сегодня, состоит в том, что у меня есть один пользовательский JPanel, который включает некоторые компоненты Swing (JScrollPane, обертывающий JEditorPane).Этот JPanel включает в себя один из моих пользовательских JComponents, а затем этот второй JComponent с JScrollPane.
Примерно в 75% случаев этот второй JComponent с JScrollPane неправильно позиционируется в экспортированном изображении, когда я выполняюэкспорт.Он расположен в точке (0, 0), а его размер соответствует тому, как он выглядит на экране.Метод draw () для этого JComponent выглядит следующим образом:
public void draw(Graphics2D g2, Rectangle componentArea) {
scrollPane.setBounds(componentArea);
textArea.setText(null);
sb.append("<html>");
sb.append("<h1 style=\"text-align:center;\">" + "XXXXXXXXX XXXXXXX" + "</h1>");
textArea.setText(sb.toString());
super.paintComponents(g2);
}
Но примерно в 25% случаев это работает - этот JComponent с полосой прокрутки правильно расположен на моем экспортированном изображении.Перерисовать компонент работает.
Как будто здесь происходит какая-то двойная буферизация, которую я не могу извлечь ....
Идеи?