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:
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: