Swing: Obtenir l'Image de JFrame
Comment puis-je obtenir un java.awt.Image
d'une JFrame?
Je veux obtenir une capture d'écran d'une JFrame
(pour une utilisation ultérieure dans mon application). C'est actuellement réalisée à l'aide du robot de prendre une capture d'écran en spécifiant les coordonnées et les dimensions de la JFrame
impliqués.
Cependant, je crois qu'il existe une meilleure façon: les composants Swing, par défaut, de rendre eux-mêmes comme des images dans une double mémoire tampon avant de peindre eux-mêmes sur l'écran.
Est-il un moyen d'obtenir ces images de la composante?
- Oui Swing composants peut rendre eux-mêmes, mais une JFrame est pas un composant Swing de sorte que vous besoin d'utiliser le Robot si vous voulez capturer la barre de titre ainsi. Bien sûr, si vous utilisez: JFrame.setDefaultLookAndFeelDecorated(true); alors vous devriez être en mesure de rendre la totalité de l'image.
- Pour les futurs lecteurs: JFrame est et a toujours été un composant swing. Le commentaire ci-dessus est faux.
Vous devez vous connecter pour publier un commentaire.
ComponentImageCapture.java
Capture d'écran
Voir aussi
Le code ci-dessus suppose que le composant a été réalisé sur l'écran, avant le rendu.
Rob Camick montre comment peindre une composante latente dans le L'Image De L'Écran classe.
Un autre thread qui pourrait être de pertinence, est Rendre JLabel sans 1er affichage, en particulier les 'une ligne de repère en Darryl Burke.
LabelRenderTest.java
Ici est une variante de mise à jour du code indiqué sur le deuxième lien.
Capture d'écran
component.paint( image.getGraphics() );
encore s'agit de faire une copie de laImage
. Je cherchais un moyen d'obtenir laImage
directement à partir de la mémoire tampon, en effet, si c'était possible. Je vais accepter votre réponse si personne ne répond à ce!label.setSize()
méthode, le texte sur laJLabel
n'apparaît pas? Pourquoi est-ce arrivé? (Je vous remercie. +1)pack()
ouvalidate()
. Ces méthodes vont souvent de la base de la taille sur la taille préférée. Parce que pas de mises en page sont ici concernés, nous avons besoin de définir la taille explicitement. Plus d'info. dans l'Oracle fil lié à la réponse.g.setColor(Color.BLACK)
avanttextLabel.paint(g);
j'ai essayé de l'enlever et rien n'a changé!