Aide pour tmtc et andrada

Niroken
Aide pour tmtc et andrada

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

fredericmazue

Belle contrib, y a pas à dire.
Merci, Niroken de tes nombreux et consistents apports à ce forum :)

Me permets tu une petite remarque toutefois ?
J'ai vu que tu redéfinis la méthode paint pour dessiner dans un JPanel. Sun recommande de rédéfinir la méthde paintComponent plutôt.

C'est par exemple expliqué ici:

http://java.sun.com/products/jfc/tsc/articles/painting/#callback

En voici un extrait:

Quote:
Swing programs should override paintComponent() instead of overriding paint(). Although the API allows it, there is generally no reason to override paintBorder() or paintComponents() (and if you do, make sure you know what you're doing!). This factoring makes it easier for programs to override only the portion of the painting which they need to extend. For example, this solves the AWT problem mentioned previously where a failure to invoke super.paint() prevented any lightweight children from appearing.

Ceci soit dit sans diminuer ta contribution pour laquelle je te remercie à nouveau.

Niroken

Hé hé,

Je viens de voir ta remarque en effet, ca m'a en tout cas corrigé un problème.

Mes deux boutons déssinés dans le panel était "masqués" par l'affichage
du paint et de l'appel a super.paint(g) si je peignait tt mon panel en blanc
avec un fillRect(0, 0, 300, 300);
Bon faut pas se laisser arréter par si peu, il suffisait de ne pas remplir
tout le panel en blanc mais bon :D

En remplacant par un paintComponent() et un appel a super.paintComponent(),
ce soucis disparait et l'on peut peindre tout le panel en blanc.

Eh ben mci fred, ca m'aidera pcke j'ai fait pas mal d'applis graphiques
en java et je ne pense pas m'arréter la :)

fredericmazue

Quote:
Eh ben mci fred,

De rien :)
Quote:
ca m'aidera pcke j'ai fait pas mal d'applis graphiques
en java et je ne pense pas m'arréter la

Tu qui as l'air mordu de programmation. Pourquoi ne pas laisser tomber le joujou et faire ça en C++ avec Qt ? Je suis sûr que ça te plairaît énormément.
tmtc

merci beaucoup niroken,pour le temps que tu as pu consacrer pour m'aider. Grâce à toi, j'ai pu résoudre mon pb.