Comment tracer des ligner, rectangle et cercle dans mon programme? (coder plus l

Résolu
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011 - 9 févr. 2011 à 22:55
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011 - 10 févr. 2011 à 14:33
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();
}
}
A voir également:

8 réponses

Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 févr. 2011 à 10:23
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
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
9 févr. 2011 à 23:46
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
0
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011
9 févr. 2011 à 23:53
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.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 févr. 2011 à 00:02
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011
10 févr. 2011 à 00:07
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();
}
}
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
10 févr. 2011 à 00:42
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
0
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011
10 févr. 2011 à 01:57
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?
0
PandaProtector23 Messages postés 5 Date d'inscription mercredi 9 février 2011 Statut Membre Dernière intervention 10 février 2011
10 févr. 2011 à 14:33
Merci beaucoup je devrait etre capable de me débrouiller a ce point. :)
0
Rejoignez-nous