Existe-t-il un moyen de convertir un JPanel (qui n'a pas encore été affiché) en BufferedImage?Convertir JPanel en image
grâce,
Jeff
Existe-t-il un moyen de convertir un JPanel (qui n'a pas encore été affiché) en BufferedImage?Convertir JPanel en image
grâce,
Jeff
De l'BufferedImage vous pouvez créer un objet graphique, que vous pouvez utiliser pour appeler la peinture sur le JPanel, quelque chose comme:
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.paint(g);
return bi;
}
Vous devrez peut-être assurez-vous de définir la taille du panneau en premier.
bien, merci. Y at-il un moyen que je peux comprendre ce que la taille du panneau devrait être (peut-être sa taille préférée)? –
Je crois que c'est la taille préférée, ou la taille actuelle, tant qu'elle a déjà été rendue. Il y a des problèmes si cela n'a pas déjà été rendu - je ne me souviens pas des détails exacts, mais je me souviens avoir rencontré des propriétés similaires lors de la mise en place d'un système d'impression. – aperkins
Oui, la taille préférée fonctionne, mais comme vous l'avez dit, elle ne s'affiche pas si le panneau n'est pas encore affiché, ce qui ne m'aide pas vraiment beaucoup. Y at-il un moyen de "rendre" mais ne pas l'afficher sur l'écran? Fondamentalement, je construis un composant qui doit être écrit sur une image mais pas affiché. –
Fondamentalement, je suis la construction d'une composante qui doit s'écrit à une image mais pas affichée
ScreenImage explique comment faire ce que vous voulez.
Section pertinente de ScreenImage.java (légèrement modifié). layoutComponent
force tous les boutons apparaissent dans l'image.
/**
* @return Renders argument onto a new BufferedImage
*/
public BufferedImage createImage(JPanel panel, int width, int height) {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
panel.setSize(width, height); // or panel.getPreferedSize()
layoutComponent(panel);
panel.print(g);
return bi;
}
private void layoutComponent(Component component) {
synchronized (component.getTreeLock()) {
component.doLayout();
if (component instanceof Container) {
for (Component child : ((Container) component).getComponents()) {
layoutComponent(child);
}
}
}
}
Jetez un coup d'œil à BasicTableUI. Le rendu de cellule est dessiné sur l'image sans montrer, puis dessiné sur le composant de la table visible.
La réponse de Tom est fondamentalement correcte, mais appeler paint()
directement n'est pas recommandé, car il s'agit d'un appel synchrone et peut interrompre avec une autre opération sur le thread pivotant. Au lieu d'utiliser paint()
, nous devrions utiliser print()
à la place
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
return bi;
}
Je suis d'accord. JPanel.print() est meilleur. JPanel.paint() conduit à une erreur dans mon application.
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
return bi;
}
Eh bien, j'abandonne. Je vous ai donné deux réponses dans vos deux dernières publications que vous avez complètement ignorées. Bonne chance avec les futurs messages. – camickr
J'apprécie les réponses et je ne les ai pas ignorées. Sur ce post, ScreenImage n'était pas exactement ce que je cherchais et cette méthode de peinture sur d'autres graphismes semblait être la bonne direction pour moi. Sur le message de la boîte de dialogue, il s'est avéré être un non-problème et j'ai été submergé de sorte que je n'ai pas répondu à tout. J'apprécie vos réponses. –