J'ai un problème bizarre en essayant d'exporter des JPanels Java personnalisés vers un fichier PNG. Le processus d'exportation des composants que j'ai rédigés jusqu'ici a fonctionné parfaitement.Composant JComponent personnalisé avec composants Swing incorporés non positionnés dans l'image exportée
Mes JPanels incluent des composants JComponents personnalisés (par exemple, redéfinir paintComponent (Graphics g) et écrire ce que je dois faire).
Le processus d'exportation se présente comme suit (du JPanel étendu je):
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();
}
}
La méthode « draw() » provoque surtout des composants enfants du JPanel à tirer réutilisant la nouvelle taille de l'image à exporter. Fonctionne très bien. Le problème que j'ai aujourd'hui est que j'ai un JPanel personnalisé qui inclut des composants Swing (un JScrollPane enveloppant un JEditorPane). Ce JPanel inclut l'un de mes composants JComponents personnalisés, puis ce second composant JComponent avec le composant JScrollPane. Environ 75% du temps, ce second composant JComponent avec JScrollPane n'est pas positionné correctement dans l'image exportée lorsque j'exécute l'exportation. Il est positionné au point (0, 0) et la taille est ce à quoi il ressemble à l'écran. La méthode « draw() » pour cette JComponent se présente comme suit:
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);
}
Mais environ 25% du temps, cela fonctionne - ce JComponent avec le scrollpane est correctement positionné dans mon image exportée. Le re-dessiner les composants fonctionne.
Il est comme il y a une double mise en mémoire tampon passe ici que je ne peux pas figger ....
idées?
Non, je ne sais pas. Le composant personnalisé JComponents vient de se peindre sur le contexte graphique de la nouvelle image. ils ont fait tout le positionnement de bits de bas niveau eux-mêmes en utilisant le rectangle transmis. – redBeard