Comment éviter de redessiner tout le JPanel ?
Bonjour à tous,
Dans le cadre d'une application graphique similaire à Photoshop je me pose quelques questions :
J'ai une class Image qui est un JPanel pour lequel je place une image dans ce JPanel.
Lors de la méthode Paint() je fais appel à une méthode d'une autre classe SelectionModule : DrawRectangle.
L'idée est de tracer avec la souris un rectangle de sélection, comme dans photoshop.
Or, lors de l'évènement MouseDragged (en autre) je fais un Image.Repaint()
Ainsi je redessine l'image - et le rectangle.
Concrètement :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class ImagePanel extends JPanel {
[...]
public void paintComponent(Graphics g) {
super.paintComponent(g); // Paint background
if (image != null) { // Un image existe : On la dessine }
parent.getZoneModule().drawRectangle(g);
}
[...]
}
public class SelectZoneModule extends Module implements ... {
ImagePanel Image;
[...]
public void mouseDragged(MouseEvent e) {
// Dessiner le rectangle
Image.repaint(); // Redessine le panel
}
[...]
public void drawRectangle(Graphics g) {
// Dessiner le rectangle
}
[...]
} |
J'aimerai savoir si il n'existe pas une solution en couche qui permet de ne redessiner que le rectangle en question ... et par conséquent je ne touche pas à l'image (et le processus demande par conséquent moins de ressources)
D'autres part - et rien avoir avec le graphique, n'est-il pas possible d'obtenir la taille d'une image JPG sans le chargement de cette image.
La machine virtuelle n'alloue pas beaucoup d'image et j'aimerai pouvoir intercepter l'erreur OutOfMemory (ainsi j'aurais une méthode qui irait lire la taille de l'image et comparerait avec l'espace libre en mémoire virtuelle...)