Voila plusieurs personnes se sont posées la question de comment
faire pour sélectionner différents élements dans un panel de dessin
tout en ayant dessiné les figures (rectangle, cercle, polygone, etc)
En fait il faut faire hériter de nouvelles classes rectangle qui implémen
teront la méthode de dessin correspondante ..les classes parentes
seront les classes Rectangle pour un rectangle, il y a la classe polygon
=> ces classes possèdent deja la méthode contains qui permet de dire
si oui ou non un point cliqué sur le panel appartient a la figure...
J'ai donc codé un premier exemple incomplet (incomplet par manque de
temp surtt) voici rapidement comment il fonctionne :
La fenetre de dessin comporte deux boutons :
Si vous cliquez sur le bouton "Ajouter un rectangle" : vous n 'aurez
qu'a drag la souris pour dessiner un rectangle.
Pour désactiver ce mode..recliquez sur le bouton "Ajouter un rectangle"
Quand vous avez désactivé le mode ajout de rectangle quand vous
cliquez sur l un des rectangles il apparait en vert..
cliquez sur le bouton surrpimer le rectangle pour le supprimer.
L'algo est celui ci : le panel dessin contient une liste de rectangle
(seulement a lheure actuelle : a compléter par cercles polygons etc)
quand vs ajouter un rectangle il sajoute ala liste et le repaint peint
tt les rectangles, quand vs en supprimez un il est retiré de la liste
un pti coup de repaint et a pu de rectangle.
Je n'ai pas géré la superposition encore !
Voici le code :
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class FigGeom { public static void main(String[] args) { FenetreDessin fenetreDessin = new FenetreDessin(); } } class FenetreDessin extends JFrame { PanelDessin panelDessin = new PanelDessin(); public FenetreDessin() { Dimension tailleEcran = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); int hauteurEcran = (int)tailleEcran.getHeight(); int largeurEcran = (int)tailleEcran.getWidth(); setTitle("Jolis Dessins"); setLocation((largeurEcran / 2) - (175), (hauteurEcran / 2) - (200)); setSize(350, 400); setLayout(null); panelDessin.setBounds(20, 20, 300, 330); add(panelDessin); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class PanelDessin extends JPanel implements MouseListener, ActionListener, MouseMotionListener { ArrayList arrayListFigGeom = new ArrayList(); JButton jButtonSupprFigSelected = new JButton("Supprimer le rectangle sélectionné"); JButton jButtonAddRectangle = new JButton("Ajouter un Rectangle"); JLabel jLabelMode = new JLabel("Mode ajout désactivé"); boolean modeAjout = false; int Xdebut = 0; int Ydebut = 0; int CurrentX = 0; int CurrentY = 0; public PanelDessin() { arrayListFigGeom.add(new MonRectangle(10, 10, 30, 30)); arrayListFigGeom.add(new MonRectangle(50, 50, 30, 30)); addMouseListener(this); addMouseMotionListener(this); setLayout(null); jButtonSupprFigSelected.setBounds(10, 270, 130, 20); jButtonAddRectangle.setBounds(160, 270, 130, 20); jLabelMode.setBounds(80, 300, 200, 20); jButtonSupprFigSelected.addActionListener(this); jButtonAddRectangle.addActionListener(this); add(jButtonSupprFigSelected); add(jButtonAddRectangle); add(jLabelMode); } public void paint(Graphics g) { super.paint(g); g.setColor(new Color(255, 255, 255)); g.fillRect(0, 0, 300, 260); g.setColor(new Color(0, 0, 0)); g.drawRect(0, 0, 299, 299); for (int i = 0; i < arrayListFigGeom.size(); i++) { if (arrayListFigGeom.get(i) instanceof MonRectangle) { MonRectangle monRectangle = (MonRectangle) arrayListFigGeom.get(i); monRectangle.DessineMonRectangle(g); } } g.setColor(new Color(0, 0, 0)); //System.out.println("" + Xdebut + " " + Ydebut + " " + CurrentX + " " + CurrentY); g.drawRect(Xdebut, Ydebut, (CurrentX - Xdebut), (CurrentY - Ydebut)); } public void actionPerformed(ActionEvent e) { if ((JButton) e.getSource() == jButtonSupprFigSelected) { for (int i = 0; i < arrayListFigGeom.size(); i++) { if (arrayListFigGeom.get(i) instanceof MonRectangle) { MonRectangle monRectangle = (MonRectangle) arrayListFigGeom.get(i); if (monRectangle.isSelected) arrayListFigGeom.remove(i); } } } if ((JButton) e.getSource() == jButtonAddRectangle) { modeAjout = !modeAjout; if (modeAjout) jLabelMode.setText("Mode ajout activé"); if (!modeAjout) jLabelMode.setText("Mode ajout désactivé"); } this.repaint(); } public void mouseClicked(MouseEvent e) { if (!modeAjout) { int indexFigClicked = 0; for (int i = 0; i < arrayListFigGeom.size(); i++) { if (arrayListFigGeom.get(i) instanceof MonRectangle) { MonRectangle monRectangle = (MonRectangle) arrayListFigGeom.get(i); if (monRectangle.contains(e.getX(), e.getY())) { monRectangle.isSelected = !monRectangle.isSelected; indexFigClicked = i; } } } for (int i = 0; i < arrayListFigGeom.size(); i++) { if (arrayListFigGeom.get(i) instanceof MonRectangle) { MonRectangle monRectangle = (MonRectangle) arrayListFigGeom.get(i); if (i != indexFigClicked) monRectangle.isSelected = false; } } } this.repaint(); } public void mousePressed(MouseEvent e) { if (modeAjout) { Xdebut = e.getX(); Ydebut = e.getY(); } } public void mouseReleased(MouseEvent e) { if (modeAjout) { arrayListFigGeom.add(new MonRectangle(Xdebut, Ydebut, (CurrentX - Xdebut), (CurrentY - Ydebut))); Xdebut = 0; Ydebut = 0; CurrentX = 0; CurrentY = 0; } } public void mouseExited(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } public void mouseDragged(MouseEvent e) { if (modeAjout) { CurrentX = e.getX(); CurrentY = e.getY(); } this.repaint(); } } class MonRectangle extends Rectangle { boolean isSelected = false; public MonRectangle(int x, int y, int width, int height) { super(x, y, width, height); } public void DessineMonRectangle(Graphics g) { if (isSelected) g.setColor(Color.green); else g.setColor(Color.black); g.drawRect((int)getX(), (int)getY(), (int)getWidth(), (int)getHeight()); } }
Bonne chance