Créer un canevas à l'aide de Java Swing

Mehvish Ashiq 15 février 2024
Créer un canevas à l'aide de Java Swing

En Java, nous pouvons créer un canevas de deux manières, en utilisant Java AWT ou Java Swing. Aujourd’hui, nous allons apprendre à utiliser Java Swing pour créer un canevas et dessiner des formes.

Utiliser Java Swing pour créer un canevas

Exemple de code (la classe PaintPanel.java) :

// write your package here
package com.voidtesting.canvas;
// import necessary libraries
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;

public class PaintPanel extends JPanel {
  // count the number of points
  private int pointCounter = 0;
  // array of 10000 Point references
  private Point[] points = new Point[10000];

  // make GUI and register the mouse event handler
  public PaintPanel() {
    // handles frame mouse motion event
    addMouseMotionListener(new MouseMotionAdapter() {
      // store the drag coordinates and repaint
      @Override
      public void mouseDragged(MouseEvent event) {
        if (pointCounter < points.length) {
          // find points
          points[pointCounter] = event.getPoint();
          // increment point's number in the array
          ++pointCounter;
          // repaint JFrame
          repaint();
        } // end if
      } // end mouseDragged method
    } // end anonymous inner class
    ); // end call to the addMouseMotionListener
  } // end PaintPanel constructor

  /*
  draw oval in a 5 by 5 bounding box at the given location
  on the window
  */
  @Override
  public void paintComponent(Graphics g) {
    // clear drawing area
    super.paintComponent(g);
    // draw all points that we have in array
    for (int i = 0; i < pointCounter; i++) g.fillOval(points[i].x, points[i].y, 5, 5);
  } // end paintComponent method
} // end PaintPanel Class

Exemple de code (la classe Canvas.java) :

// write your package here
package com.voidtesting.canvas;
// import necessary libraries
import java.awt.BorderLayout;
import java.awt.Label;
import javax.swing.JFrame;

public class Canvas {
  public static void main(String[] args) {
    // create JFrame Object
    JFrame jFrame = new JFrame("Canvas Using Java Swing");
    // create PaintPanel Object
    PaintPanel paintPanel = new PaintPanel();
    // add paintPanel in center
    jFrame.add(paintPanel, BorderLayout.CENTER);
    // place the created label in the south of BorderLayout
    jFrame.add(new Label("Drag the mouse to draw"), BorderLayout.SOUTH);
    // exit on close
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // set frame size
    jFrame.setSize(500, 400);
    // set jFrame location to center of the screen
    jFrame.setLocationRelativeTo(null);
    // display frame
    jFrame.setVisible(true);
  }
}

Production:

créer une toile à l&rsquo;aide de java swing - dessiner sur une toile

Dans la classe PaintPanet.java, il étend le JPanel pour créer une zone dédiée au dessin. La classe Point représente les coordonnées x et y.

Nous créons un objet de la classe Point pour enregistrer toutes les coordonnées de chaque événement de déplacement de la souris pendant que la classe Graphiques est utilisée pour dessiner. Pour cet exemple, nous utilisons un tableau de type Point contenant les 10 000 points/coordonnées qui stocke l’emplacement où chaque événement de déplacement de la souris se produit.

On peut voir que le paintComponent utilise ces coordonnées pour dessiner. Veuillez noter que la variable d’instance nommée pointCounter garde toujours une trace du nombre total de points capturés via l’événement de glissement de la souris.

Dès qu’il atteindra la limite de 10 000, nous ne pourrons plus tirer.

Ensuite, nous enregistrons le MouseMotionListener qui peut écouter l’événement de mouvement de la souris de la classe PaintPanel. Dans l’écouteur addMouseMotionListener(), nous créons un objet de la classe interne anonyme qui étend la classe d’adaptateur nommée MouseMotionAdapter.

Pourquoi remplace-t-on mouseDragged ? Parce que le MouseMotionAdapter implémente le MouseMotionListener, l’objet de classe interne anonyme est le MouseMotionListener. La classe interne anonyme hérite des implémentations par défaut mouseMoved et mouseDragged.

Ainsi, il implémente déjà toutes les méthodes de l’interface. Cependant, la méthode par défaut ne fait rien chaque fois que celles-ci sont appelées, c’est pourquoi nous redéfinissons le mouseDragged pour capturer les points de l’événement de glissement de la souris et les enregistrer en tant qu’objet Point.

L’instruction if garantit que nous n’enregistrons les points dans le tableau que si nous en avons la capacité. La méthode getPoint() est invoquée pour récupérer les coordonnées où l’événement s’est produit, les enregistrer dans le tableau points à l’index pointCounter, puis incrémenter également le pointCounter.

Avant de sortir l’instruction if, nous utilisons la méthode repaint() qui gère les mises à jour du cycle de peinture. Ensuite, la méthode paintComponent reçoit le paramètre de Graphics qui est appelé automatiquement chaque fois que le PaintPanel doit être affiché sur l’écran de l’ordinateur.

Dans la méthode paintComponent, nous invoquons la superclasse de paintComponent pour effacer la zone de dessin. Rappelez-vous que nous utilisons le mot-clé super pour accéder aux méthodes et instances de la superclasse.

Nous dessinons un ovale 5 par 5 à l’emplacement donné par chaque point d’un tableau pouvant aller jusqu’au pointCounter tandis que la méthode fillOval() dessine l’ovale solide.

Venons-en maintenant au Canvas.java, la classe principale. Il crée les objets de JFrame et PaintPanel.

Ensuite, on utilise la méthode add() pour ajouter l’objet du PaintPanel au centre de la fenêtre JFrame. Nous utilisons BorderLayout.CENTER pour l’ajouter au centre de la fenêtre JFrame.

Ensuite, nous ajoutons un Label au sud de la fenêtre JFrame en utilisant BorderLayout.SOUTH. Après cela, nous utilisons les méthodes setDefaultCloseOperation(), setSize(), setLocationRelativeTo(), et setVisible() pour fermer la fenêtre lorsque l’utilisateur clique sur le signe croix (X), définir le taille de la fenêtre JFrame, déplacez la fenêtre JFrame au centre de l’écran de l’ordinateur et affichez-la respectivement.

Au lieu de dessiner manuellement sur le canevas, nous pouvons dessiner par programmation.

Exemple de code (la classe Draw.java a la méthode main) :

// write your package here
package com.voidtesting.canvas.draw;
// import necessary libraries
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Draw extends JPanel {
  @Override
  public void paintComponent(Graphics g) {
    // call method of the super class
    super.paintComponent(g);
    // set background color
    this.setBackground(Color.cyan);

    // set color of the shape
    g.setColor(Color.red);
    // draw line
    g.drawLine(5, 30, 380, 30);

    // set color of the shape
    g.setColor(Color.blue);
    // draw rectangular
    g.drawRect(5, 40, 90, 55);

    // set color of the shape
    g.setColor(Color.BLACK);
    // draw string
    g.drawString("Hi, how are you?", 100, 50);

    // set color of the shape
    g.setColor(Color.green);
    // draw filled rectangular
    g.fill3DRect(5, 100, 90, 55, true);
    // draw filled oval
    g.fillOval(150, 100, 90, 55);
  }

  public static void main(String[] args) {
    // create JFrame Object
    JFrame jFrame = new JFrame("Canvas");
    // add the object of Draw Class in center
    jFrame.add(new Draw(), BorderLayout.CENTER);
    // exit on close
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // set frame size
    jFrame.setSize(300, 200);
    // set jFrame location to center of the screen
    jFrame.setLocationRelativeTo(null);
    // display frame
    jFrame.setVisible(true);
  }
}

Production:

créer un canevas à l&rsquo;aide de java swing - dessiner par programme sur un canevas

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Article connexe - Java Swing