Graphics - Ajouter des figures sans effacer les précedentes

Résolu/Fermé
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018 - Modifié le 23 janv. 2018 à 13:35
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018 - 23 janv. 2018 à 14:22
Bonjour,


Je commence seulement à mettre mon nez dans java Graphics, et après avoir eu un peu de mal à saisir la manière de procéder pour mon projet, je suis face à une nouvelle problématique et je peine à trouver des informations...

L'idée est de créer un mini "paint" sur une partie de mon projet. Je souhaiterais que mon application affiche par défaut un cercle sur mon jpanel, puis que l'utilisateur puisse rajouter des points de couleurs/ tailles différentes sans que cela efface le cercle initiale ou les points que l'utilisateur à déjà ajouter.

import java.awt.Color;
import java.awt.Graphics;

public class img extends javax.swing.JPanel {

    public img() 
    {
        initComponents();
    }


@Override
public void paintComponent(Graphics g)
    {
        super.paintComponent(g); 
        g.setColor(Color.BLACK);
        g.drawOval(28, 28, 120, 120);
            
        if (choix == 1)
        {
            g.setColor(Color.GREEN);
            g.fillOval(X, Y, 5, 5);
        }
    }


private void formMouseClicked(java.awt.event.MouseEvent evt) 
{                                  
        choix = 1;
        X = evt.getX();
        Y = evt.getY();
        repaint();
} 


int choix =0;
int X;
int Y;
} 


Le problème avec ce code, c'est qu'il redessine à chaque fois la figure et donc ne position qu'un seul point vert au lieu d'un point à chaque clic.

Pour modifier la taille et la couleur des points, j'ai déjà une belle idée de comment procéder (sélection sur des jbutton etc..) donc ce n'est pas la question ;).

ps: je travail sous netbeans, une partie du code est auto-généré (initComponents() inclu juste la création du jpanel et le listener de la souris)

Merci d'avance,
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
23 janv. 2018 à 13:45
Bonjour,

C'est normal qu'il redessine puisque tu fait un
repaint();
(c'est un peu le but de la méthode...)
Même si tu pourrais demander à ne redessiner qu'une partie de la fenêtre avec
repaint(0, x, y, width, height);


Le vrai problème c'est que tu ne stockes pas les valeurs qu'il faudrait redessiner, X et Y c'est bien pour un seul point, mais si tu veux tout l'historique il faut les conserver.

Exemple :

import java.awt.Point;
import java.util.List;
import java.util.ArrayList;

private final List<Point> points = new ArrayList<>();

for (Point point : points)
    g.fillOval(point.x, point.y, 5, 5);

points.add(new Point(evt.getX(), evt.getY());

Remarque : "je travail sous netbeans, une partie du code est auto-généré"
C'est une mauvaise idée pour apprendre à programmer, parce que du coup tu ne peux pas comprendre ce qu'il se cache derrière...
1
sansordi Messages postés 80 Date d'inscription lundi 19 novembre 2007 Statut Membre Dernière intervention 23 janvier 2018
23 janv. 2018 à 14:22
Merci beaucoup! ça fonctionne parfaitement!
En effet, passer par une ArrayList simplifie les choses et permet le stockage des données, je n'y pense pas encore suffisamment... et pourtant !

(Redessiner une partie de la fenêtre n'est pas approprié pour ce projet, enfin me semble-t-il, dù au risque de superposition.)


Pour Netbeans, je sais bien que ce n'est pas le top, mais comme j'avais beaucoup d'éléments graphiques à positionner sans avoir une seule idée du rendu final, cela m'a permis de faire la maquette de mon projet tout apprenant à coder le reste. Aujourd'hui je suis sur la fin de mon projet grâce à Netbeans. Sans lui, je serai encore en train de me demander à quoi aller ressembler mon appli... Donc oui, je suis encore plus que débutant en BorderLayout et compagnie, mais mon projet est en train de voir le jour ;).
Pour être parti de 0 (je ne savais même pas écrire le fameux "Hello World"...), aujourd'hui j'ai une app qui fait de la gestion de client.
0