Comment tracer des ligner, rectangle et cercle dans mon programme? (coder plus l [Résolu]

Signaler
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011
-
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011
-
Je travaille sur un programme 'paint' pour un cour d'info et je suis coincé. J'aimerai pouvoir dessiner une ligne dans le rectangle blanc apres avoir selectionner le bouton ligne. Voici mon code, diviser en 3 classe. Merci d'avance

//cree une fenetre
public class QUESTION
{
public static void main(String[] args)
{
Paint_GUI test2 = new Paint_GUI();
}
}

import java.awt.;
import javax.swing.;

//class contenant le code pour dessiner
public class Paint_Dessin extends JPanel{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.white);
g.setColor(Color.black);
}

public void TracerLigne()
{
System.out.println("LIGNE");
}
}

import javax.swing.;
import java.awt.event.;
import java.awt.*;

public class Paint_GUI extends JFrame
{
//Panels contenant tout les bouton de mon interface
private JPanel panelBtn;

//Bar d'outil Btn
private JButton BtnTracerLigne;

public Paint_GUI()
{
final int WINDOW_WIDTH = 650;
final int WINDOW_HEIGHT = 450;

setSize (WINDOW_WIDTH, WINDOW_HEIGHT);
setTitle("Paint v.2.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

// Appeler la methode qui construit la barre de BTN.
buildPanelBtn();
add(panelBtn, BorderLayout.NORTH);
Paint_Dessin espaceDessin = new Paint_Dessin();
add(espaceDessin, BorderLayout.CENTER);

// Afficher la fenetre.
setVisible(true);
}
private void buildPanelBtn()
{
BtnTracerLigne = new JButton("Ligne");
BtnTracerLigne.addActionListener(new LigneListener());

// Creer le panel.
panelBtn = new JPanel();
// Ajouter les composantes au label
panelBtn.add(BtnTracerLigne);
}
private class LigneListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
Paint_Dessin tracerLigne = new Paint_Dessin();
tracerLigne.TracerLigne();
}
}

8 réponses

Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

Je ne suis pas partant pour te faire tout le code (long et chiant) mais pour dessiner des lignes, cercles, etc.. tu as 2 méthodes :
1 - Affichage temps réel de ton tracé : utilise les listeners MouseListener et MouseMotionListener. Le principe et de capter ton point de départ (mousePressed), de récupérer la position de la souris pendant le déplacement pour dessiner en même temps (mouseDragged) et de finaliser la figure au moment ou l'utilisateur relâche la souris(mousseReleased)
2 - Tu veux dessiner la figure à la fin. Le principe et de capter ton point de départ (mousePressed), et de finaliser la figure au moment ou l'utilisateur relâche la souris (mousseReleased)

Pour ce qui est de la classe qui va se mettre en écoute sur les différentes actions de la souris, au plus simple et plus logique, je te dirai la classe Paint_Dessin

Le @Overrive est ajouté par eclipse, à toi il ne te sert à rien et si ça te défrise tu peux l'enlever.




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

Pourquoi tu refais une instance de ton objet Paint_Dessin au moment du clic sur ton bouton ????? en faisant ça tu vas appeler la méthode TracerLigne d'un nouvel objet Paint_Dessin et certainement pas de celui que tu as ajouté au panel de ta fenêtre ô_O du coup même si tu codes une fonction de traçage de ligne tu ne le verras jamais




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011

Je sais que je ne devrait pas faire Paint_Dessin tracerLigne = new Paint_Dessin(); mais plutot me servir de l'instance deja crée nommé espaceDessin que je crée plus haut dans le code. Cependant, je n'ai pas réussie a appelé ma fonction tracerLigne() avec espaceDessin. Alors j'ai créer une nouvel instance pour l'apeler et sa fonctionne. SI tu prend mon code et le run sur un ide, ma fonction tracerligne est bel et bien runner et cela ne cause pas de problème. Cependant ce que jai besoin c de créer une fonction tracerligne qui trace vraiment une ligne. merci d'avoir répondue si vite.
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

ATTENTION c'est PAS parce que ça t'affiche ta trace console que tu auras le résultat dans ta fenêtre.......




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011

Oui désolé j'ai revérifier mon code. Voici les modification

**************************************
//cree une fenetre
public class QUESTION
{
public static void main(String[] args)
{
Paint_GUI test2 = new Paint_GUI();
}
}

**************************************
import java.awt.;
import javax.swing.;

//class contenant le code pour dessiner
public class Paint_Dessin extends JPanel{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.white);
g.setColor(Color.black);
}

public void TracerLigne()
{
System.out.println("LIGNE");
}
}

******************************************

import javax.swing.;
import java.awt.event.;
import java.awt.*;

public class Paint_GUI extends JFrame
{
//Panels contenant tout les bouton de mon interface
private JPanel panelBtn;

//Bar d'outil Btn
private JButton BtnTracerLigne;

//Object Paint_Dessin
Private Paint_Dessin espaceDessin = new Paint_Dessin();

public Paint_GUI()
{
final int WINDOW_WIDTH = 650;
final int WINDOW_HEIGHT = 450;

setSize (WINDOW_WIDTH, WINDOW_HEIGHT);
setTitle("Paint v.2.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

// Appeler la methode qui construit la barre de BTN.
buildPanelBtn();
add(panelBtn, BorderLayout.NORTH);
add(espaceDessin, BorderLayout.CENTER);

// Afficher la fenetre.
setVisible(true);
}
private void buildPanelBtn()
{
BtnTracerLigne = new JButton("Ligne");
BtnTracerLigne.addActionListener(new LigneListener());

// Creer le panel.
panelBtn = new JPanel();
// Ajouter les composantes au label
panelBtn.add(BtnTracerLigne);
}
private class LigneListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
espaceDessin.TracerLigne();
}
}
Messages postés
5363
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
30 avril 2021
110
Salut,

Ok maintenant on peut passer au vrai sujet.
Dans le code ci dessous je vais juste changer ta classe Paint_Dessin pour dessiner dans une image et ensuite l'afficher.
Je t'ai également ajouté de quoi afficher des ellipses et de quoi faire un reset du buffer.
class Paint_Dessin extends JPanel {
private static final long   serialVersionUID    = -2110723486099015303L;
// pour la position au pif de la ligne
private static final Random RAND                = new Random();			
private BufferedImage       buffer              = null;

@Override
public void paintComponent(final Graphics g) {
// super.paintComponent(g); // pas besoin
// setBackground(Color.white); // pas besoin
// g.setColor(Color.black); // pas besoin
final Graphics2D g2 = (Graphics2D) g;
g2.clearRect(0, 0, getWidth(), getHeight()); // cleanup du composant
g2.drawImage(getBuffer(), null, 0, 0);
}

public void TracerLigne() {
// System.out.println("LIGNE"); // pas besoin
final Graphics2D g2 = getBuffer().createGraphics();
// juste pour lisser la ligne
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// couleur de la ligne
g2.setColor(Color.BLACK);
// dessin la ligne au pif dans l'espace visible
final int x1 = RAND.nextInt(500); // position en X1
final int y1 = RAND.nextInt(500); // position en Y1
final int x2 = RAND.nextInt(500); // position en X2
final int y2 = RAND.nextInt(500); // position en Y2
g2.drawLine(x1, y1, x2, y2);
Line2D.Double line = new Line2D.Double(x1, y1, x2, y2);
g2.fill(line);
repaint();// force le repaint de l'objet
}

// petit plus
public void TracerOval() {
final Graphics2D g2 = getBuffer().createGraphics();
// juste pour lisser la ligne
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// couleur du cercle
g2.setColor(Color.RED);
//ajout d'une transparence aléatoire
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, RAND.nextFloat()));
// dessin la ligne au pif dans l'espace visible
final int x = RAND.nextInt(500); // position en X
final int y = RAND.nextInt(500); // position en Y
final int w = RAND.nextInt(500); // Lageur
final int h = RAND.nextInt(500); // Hauteur
g2.fillOval(x, y, w, h);
Ellipse2D.Double ellipse = new Ellipse2D.Double(x, y, w, h);
g2.fill(ellipse);
repaint();// force le repaint de l'objet
}

// petit plus
public void clear() {
final Graphics2D g2 = getBuffer().createGraphics();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f));
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,getWidth(),getHeight()); 
g2.fill(rect);
repaint();
}

private BufferedImage getBuffer() {
if (buffer == null)
buffer = new BufferedImage(getWidth(), getHeight(),
BufferedImage.TYPE_INT_ARGB);
return buffer;
}
}






------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011

wow merci beaucoup :) mais ou dois-je mettre mes mouse listener si je ne veut pas de ligne random mais d'un point x1,y1 = click1 et x2,y2 = click2?

et une autre question (parce que comme tu a problablement remarqué je ne suis pas très avancé en programmation) a koi sert le @Override?
Messages postés
5
Date d'inscription
mercredi 9 février 2011
Statut
Membre
Dernière intervention
10 février 2011

Merci beaucoup je devrait etre capable de me débrouiller a ce point. :)