Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Capture d'écran

2 réponses
Avatar
news.univ-poitiers.fr
Bonjour,

J'ai besoin de faire une capture d'écran de composants graphiques de
l'application que je suis en train de développer.

J'utilise pour cela la classe Robot et la méthode static
createScreenCapture. Toutefois cette technique ne me plait pas trop, elle a
le désavantage de faire une copie brute d'une zone avec le danger de prendre
autre chose que le composant graphique (chevauchement des fenêtres...).

N'y aurait-il pas un moyen de capturer le contenu d'un JComponent par
l'intermédiaire de la class Graphic???. Cette solution, si existante,
permettrait de capturer uniquement le rendu de l'objet et non pas les
fenêtres des autres applications.

Merci beaucoup.

2 réponses

Avatar
Cedric
"news.univ-poitiers.fr" wrote
Bonjour,

J'ai besoin de faire une capture d'écran de composants graphiques de
l'application que je suis en train de développer.

J'utilise pour cela la classe Robot et la méthode static
createScreenCapture. Toutefois cette technique ne me plait pas trop, elle
a

le désavantage de faire une copie brute d'une zone avec le danger de
prendre

autre chose que le composant graphique (chevauchement des fenêtres...).

N'y aurait-il pas un moyen de capturer le contenu d'un JComponent par
l'intermédiaire de la class Graphic???. Cette solution, si existante,
permettrait de capturer uniquement le rendu de l'objet et non pas les
fenêtres des autres applications.

Merci beaucoup.


Quelque chose de sympa a faire ( pour qui a le temps de bidouiller un peu ).
Ca serait de creer un objet qui parcours tous les elements fils du composant
choisi ( Container.getComponents() ) et de donner l'objet Graphics qui est
utilise dans le paint(Graphics g) pour le faire dessiner dans un
BufferedImage.
Voila un code qui creer une fenetre avec couleur de fond, un bouton et un
label. Quand tu cliques sur le bouton, ca copie dessine le panel ainsi que
ses fils dans un BufferedImage. Puis ca remplace tout dans le panel par
l'image ( label+imageicon):

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Painter {

JFrame jf;
JButton jb=new JButton("Blabla");
JPanel jp=new JPanel();
JLabel jl=new JLabel("Hello World!");

public Painter() {
}

public void init() {
jp.setOpaque(true);
jp.setBackground(Color.orange);
jp.add(jb);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
draw();
}
});
jp.add(jl);
jf=new JFrame("Momo");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(jp);
jf.pack();
jf.setVisible(true);
}

public void draw() {
Component list[]=jf.getComponents();
BufferedImage bi=new
BufferedImage(jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g=bi.createGraphics();
for(int i=0;i<list.length;i++) {
list[i].paint(g);
}
jp.removeAll();
jp.add(new JLabel(new ImageIcon(bi)));
}

public static void main(String a[]) {
Painter p=new Painter();
p.init();
}

}

Avatar
news.univ-poitiers.fr
Merci beaucoup, c'est tout à fait ce que je voulais.

Encore merci


"Cedric" a écrit dans le message de news:
3f152831$0$26628$
"news.univ-poitiers.fr" wrote
Bonjour,

J'ai besoin de faire une capture d'écran de composants graphiques de
l'application que je suis en train de développer.

J'utilise pour cela la classe Robot et la méthode static
createScreenCapture. Toutefois cette technique ne me plait pas trop,
elle


a
le désavantage de faire une copie brute d'une zone avec le danger de
prendre

autre chose que le composant graphique (chevauchement des fenêtres...).

N'y aurait-il pas un moyen de capturer le contenu d'un JComponent par
l'intermédiaire de la class Graphic???. Cette solution, si existante,
permettrait de capturer uniquement le rendu de l'objet et non pas les
fenêtres des autres applications.

Merci beaucoup.


Quelque chose de sympa a faire ( pour qui a le temps de bidouiller un
peu ).

Ca serait de creer un objet qui parcours tous les elements fils du
composant

choisi ( Container.getComponents() ) et de donner l'objet Graphics qui est
utilise dans le paint(Graphics g) pour le faire dessiner dans un
BufferedImage.
Voila un code qui creer une fenetre avec couleur de fond, un bouton et un
label. Quand tu cliques sur le bouton, ca copie dessine le panel ainsi que
ses fils dans un BufferedImage. Puis ca remplace tout dans le panel par
l'image ( label+imageicon):

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Painter {

JFrame jf;
JButton jb=new JButton("Blabla");
JPanel jp=new JPanel();
JLabel jl=new JLabel("Hello World!");

public Painter() {
}

public void init() {
jp.setOpaque(true);
jp.setBackground(Color.orange);
jp.add(jb);
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
draw();
}
});
jp.add(jl);
jf=new JFrame("Momo");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().add(jp);
jf.pack();
jf.setVisible(true);
}

public void draw() {
Component list[]=jf.getComponents();
BufferedImage bi=new
BufferedImage(jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g=bi.createGraphics();
for(int i=0;i<list.length;i++) {
list[i].paint(g);
}
jp.removeAll();
jp.add(new JLabel(new ImageIcon(bi)));
}

public static void main(String a[]) {
Painter p=new Painter();
p.init();
}

}