2011-02-09 1 views
1

Je travaille sur un programme de peinture pour l'un de mes cours et je suis coincé. C'est une partie de mon code (séparé en 3 classes Java). Lorsque je clique sur le bouton "Ligne", je veux pouvoir tracer une ligne dans le rectangle blanc. Désolé pour les commentaires français.Comment puis-je dessiner des lignes, des rectangles et des cercles dans mon programme de peinture Java?


//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(); 
    } 
} 

Répondre

0

vous devez créer une autre classe comme GraphComponent par exemple, qui s'étend JComponent. Vous devriez également regarder mettre en œuvre MouseInputListener. Je ne vais pas vous donner la solution, mais c'est un bon début;).

En tout cas, je vois que vous êtes français alors jetez un oeil à site-du-zero, c'est plein de très bons tutoriels.

N.B.: Vous ne devriez pas vous nommer des classes comme QUESTION, mettre à la place des questions

EDIT: ici encore des notes:

public class Paint_Dessin extends JComponent implements MouseInputListener{ 
    private List<Point> startPoints = new ArrayList<Point>(); 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     int x = e.getX(); 
     int y = e.getY(); 
     Point p = new Point(x,y); 
     startPoints.add(p); 
     repaint(); 
    } 
    protected void paintComponent(Graphics g) { 
     g.setColor(getForeground()); 
     Graphics2D g2 = (Graphics2D) g; 
     for (Point p : startPoints) 
      p.draw(g2); 
    } 
    public class Point{ 
     private int x,y; 
     public Point(int x, int y){ 
      this.x = x; 
      this.y = y; 
     } 
     void draw(Graphics2D g2) { 
      //do the drawing with the right shape you want 
     } 
    } 

et voir Shape. Vous devez implémenter d'autres méthodes à partir de MouseInputListener, comme mouseDragged, ....

+0

Ty pour la réponse rapide, je sais pour le nom de la classe :) c'est une partie de mon code que je modifie très rapidement pour le forum. – Panda

+0

Mais le vrai problème est que je ne sais pas comment faire le MouseInputListener et où je devrais le mettre – Panda

1

Vous avez actuellement un problème avec le fait que vous créez un Paint_Dessin dans la méthode actionPerformed de la classe LigneListener, et pendant que cet objet est créé de la même classe que l'objet Paint_Dessin qui est affiché dans le JFrame, il s'agit d'un objet complètement différent et les méthodes d'appel n'auront absolument aucun effet sur Paint_Dessin qui est affiché. Ce que vous devez faire est de déclarer une variable Paint_Dessin privée une fois dans la classe Paint_GUI, un champ de classe, initialiser cette variable soit à sa déclaration ou dans le constructeur Paint_GUI, puis afficher cet objet dans l'interface graphique et aussi appeler des méthodes sur cette interface graphique dans la classe d'écoute. Par exemple,

public class Paint_GUI extends JFrame 
{ 
    private JPanel panelBtn; 
    private JButton BtnTracerLigne; 
    private Paint_Dessin espaceDessin = new Paint_Dessin(); 

    public Paint_GUI() 
    { 
     final int WINDOW_WIDTH = 650; 
     //... code deleted for sake of brevity 

     // Paint_Dessin espaceDessin = new Paint_Dessin(); 
     add(espaceDessin, BorderLayout.CENTER); 

     // Afficher la fenetre. 
     setVisible(true); 
} 

private void buildPanelBtn() 
{ 
    // .... 
} 

private class LigneListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    // Paint_Dessin tracerLigne = new Paint_Dessin(); 
    // tracerLigne.TracerLigne(); 
    espaceDessin.TracerLigne(); // call the method on the same object! 
    } 
} 
+0

Oh oui ty très bien bon commentaire :) mais ce que je demande est un moyen de concevoir ma fonction TracerLigne() à effectivement dessiner une ligne. Ty pour le problème d'objet je ne l'ai pas vu – Panda

+0

Si vous voulez dessiner une ligne, alors il y a des méthodes de la classe Graphics qui vous permettent de le faire. S'il vous plaît regardez l'API. Aussi, quel rectangle blanc? Je ne vois pas de code pour ça. Et vous ne voulez vraiment pas appeler setBackground (Color) dans la méthode paint ou paintComponent. –

Questions connexes