X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/graphlib_java.git/blobdiff_plain/debc4d78217a4f8e3eae392d876875d21aa77779..df5920b2b548f1887c85a41ebc0ef87b2bd42372:/DrawingWindow.java diff --git a/DrawingWindow.java b/DrawingWindow.java index ad515ad..e7766d0 100644 --- a/DrawingWindow.java +++ b/DrawingWindow.java @@ -1,8 +1,22 @@ -import java.awt.*; -import java.awt.event.*; -import java.awt.image.*; -import javax.swing.*; -import java.lang.reflect.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Polygon; +import java.awt.Toolkit; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import javax.swing.JFrame; +import javax.swing.JPanel; /** * Fenêtre de dessin @@ -19,17 +33,8 @@ import java.lang.reflect.*; * fenêtre. Comme pour la plupart des applications, il est également * possible de fermer la fenêtre via le gestionnaire de fenêtres. * - *
Télécharger le code: DrawingWindow.java - * - *
Télécharger des exemples d'utilisation:
- * Hello.java
- * Exemple1.java
- * Exemple2.java
- * Exemple3.java
- *
* @author Arnaud Giersch <arnaud.giersch@univ-fcomte.fr>
- * @version Wed, 08 Oct 2014 21:29:23 +0200
-
+ * @version 20141021b
*/
public class DrawingWindow {
@@ -55,6 +60,11 @@ public class DrawingWindow {
this.width = width;
this.height = height;
+ mouseLock = new Object();
+ mouseEvent = null;
+ mousePos = new Point(0, 0);
+ mouseButton = 0;
+
image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
graphics = image.createGraphics();
@@ -81,6 +91,7 @@ public class DrawingWindow {
* @param color couleur
*
* @see java.awt.Color
+ * @see #setColor(int)
* @see #setColor(String)
* @see #setColor(float, float, float)
* @see #setBgColor(Color)
@@ -92,21 +103,36 @@ public class DrawingWindow {
/**
* Change la couleur de dessin.
*
- * Le nom de couleur est de la forme "black", "white", "red", "blue", ...
+ * La couleur est un entier, tel que retourné par {@link #getPointColor}.
+ * Normalement de la forme #00RRGGBB.
+ *
+ * @param rgb couleur
+ *
+ * @see #setColor(String)
+ * @see #setColor(float, float, float)
+ * @see #setBgColor(int)
+ * @see #getPointColor
+ */
+ public void setColor(int rgb) {
+ setColor(new Color(rgb));
+ }
+
+ /**
+ * Change la couleur de dessin.
*
* @param name nom de couleur
*
- * @see #setColor(Color)
+ * @see #setColor(int)
* @see #setColor(float, float, float)
* @see #setBgColor(String)
+ * @see liste des noms de couleurs
*/
public void setColor(String name) {
- try {
- Field field = Class.forName("java.awt.Color").getField(name);
- graphics.setColor((Color)field.get(null));
- } catch (Exception e) {
+ Color color = colorMap.get(name);
+ if (color != null)
+ setColor(color);
+ else
System.err.println("Warning: color not found: " + name);
- }
}
/**
@@ -120,7 +146,7 @@ public class DrawingWindow {
* @param green composante de vert
* @param blue composante de bleu
*
- * @see #setColor(Color)
+ * @see #setColor(int)
* @see #setColor(String)
* @see #setBgColor(float, float, float)
*/
@@ -133,32 +159,47 @@ public class DrawingWindow {
*
* @param color couleur
*
+ * @see #setBgColor(int)
* @see #setBgColor(String)
* @see #setBgColor(float, float, float)
* @see #setColor(Color)
- * @see #clearGraph()
+ * @see #clearGraph
*/
public void setBgColor(Color color) {
bgColor = color;
}
+ /** Change la couleur de fond.
+ *
+ * @param rgb couleur
+ *
+ * @see #setBgColor(String)
+ * @see #setBgColor(float, float, float)
+ * @see #setColor(int)
+ * @see #getPointColor
+ * @see #clearGraph
+ */
+ public void setBgColor(int rgb) {
+ setBgColor(new Color(rgb));
+ }
+
/**
* Change la couleur de fond.
*
* @param name nom de couleur
*
- * @see #setBgColor(Color)
+ * @see #setBgColor(int)
* @see #setBgColor(float, float, float)
* @see #setColor(String)
- * @see #clearGraph()
+ * @see #clearGraph
+ * @see liste des noms de couleurs
*/
public void setBgColor(String name) {
- try {
- Field field = Class.forName("java.awt.Color").getField(name);
- bgColor = (Color)field.get(null);
- } catch (Exception e) {
+ Color color = colorMap.get(name);
+ if (color != null)
+ setBgColor(color);
+ else
System.err.println("Warning: color not found: " + name);
- }
}
/** Change la couleur de fond.
@@ -167,13 +208,13 @@ public class DrawingWindow {
* @param green composante de vert
* @param blue composante de bleu
*
- * @see #setBgColor(Color)
+ * @see #setBgColor(int)
* @see #setBgColor(String)
* @see #setColor(float, float, float)
- * @see #clearGraph()
+ * @see #clearGraph
*/
public void setBgColor(float red, float green, float blue) {
- bgColor = new Color(red, green, blue);
+ setBgColor(new Color(red, green, blue));
}
/**
@@ -201,6 +242,8 @@ public class DrawingWindow {
* @see #setColor
*/
public void drawPoint(int x, int y) {
+ if (x < 0 || y < 0 || x >= width || y >= height)
+ return;
synchronized (image) {
image.setRGB(x, y, graphics.getColor().getRGB());
}
@@ -296,6 +339,50 @@ public class DrawingWindow {
panel.repaint(x - r, y - r, 2 * r + 1, 2 * r + 1);
}
+ /**
+ * Dessine un triangle.
+ *
+ * Dessine un triangle défini par les coordonnées de ses sommets:
+ * (x1, y1), (x2, y2) et (x3, y3). Utilise la couleur de dessin
+ * courante.
+ *
+ * @see #fillTriangle
+ * @see #setColor
+ */
+
+ public void drawTriangle(int x1, int y1, int x2, int y2, int x3, int y3) {
+ Polygon poly = new Polygon();
+ poly.addPoint(x1, y1);
+ poly.addPoint(x2, y2);
+ poly.addPoint(x3, y3);
+ synchronized (image) {
+ graphics.drawPolygon(poly);
+ }
+ panel.repaint(poly.getBounds());
+ }
+
+ /**
+ * Dessine un triangle plein.
+ *
+ * Dessine un triangle plein défini par les coordonnées de ses
+ * sommets: (x1, y1), (x2, y2) et (x3, y3). Utilise la couleur de
+ * dessin courante.
+ *
+ * @see #drawTriangle
+ * @see #setColor
+ */
+ public void fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3) {
+ Polygon poly = new Polygon();
+ poly.addPoint(x1, y1);
+ poly.addPoint(x2, y2);
+ poly.addPoint(x3, y3);
+ synchronized (image) {
+ graphics.drawPolygon(poly);
+ graphics.fillPolygon(poly);
+ }
+ panel.repaint(poly.getBounds());
+ }
+
/**
* Ãcrit du texte.
*
@@ -314,9 +401,93 @@ public class DrawingWindow {
* Retourne la couleur du pixel de coordonnées (x, y).
*
* @return couleur du pixel
+ *
+ * @see #setColor(int)
+ * @see #setBgColor(int)
*/
public int getPointColor(int x, int y) {
- return image.getRGB(x, y);
+ return (x < 0 || y < 0 || x >= width || y >= height) ?
+ 0 : image.getRGB(x, y) & 0x00ffffff;
+ }
+
+ /**
+ * Attend l'appui sur un des boutons de la souris.
+ *
+ * @return vrai (true) si un bouton a été pressé
+ *
+ * @see #waitMousePress(long)
+ * @see #getMouseX
+ * @see #getMouseY
+ * @see #getMouseButton
+ */
+ public boolean waitMousePress() {
+ return waitMousePress(-1);
+ }
+
+ /**
+ * Attend l'appui sur un des boutons de la souris.
+ *
+ * @param timeout temps maximal d'attente (millisecondes)
+ *
+ * @return vrai (true) si un bouton a été pressé
+ *
+ * @see #waitMousePress()
+ * @see #getMouseX
+ * @see #getMouseY
+ * @see #getMouseButton
+ */
+ public boolean waitMousePress(long timeout) {
+ boolean result = false;
+ synchronized (mouseLock) {
+ if (timeout != 0) {
+ mouseEvent = null;
+ try {
+ if (timeout > 0)
+ mouseLock.wait(timeout);
+ else // (timeout < 0)
+ mouseLock.wait();
+ }
+ catch (InterruptedException e) {
+ }
+ }
+ if (mouseEvent != null) {
+ mousePos.setLocation(mouseEvent.getPoint());
+ mouseButton = mouseEvent.getButton();
+ mouseEvent = null;
+ result = true;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Retourne la position (x) de la souris la dernière fois qu'un
+ * bouton a été pressé pendant l'appel à {@link #waitMousePress()}.
+ *
+ * @return position (x)
+ */
+ public int getMouseX() {
+ return mousePos.x;
+ }
+
+ /**
+ * Retourne la position (y) de la souris la dernière fois qu'un
+ * bouton a été pressé pendant l'appel à {@link #waitMousePress()}.
+ *
+ * @return position (y)
+ */
+ public int getMouseY() {
+ return mousePos.y;
+ }
+
+ /**
+ * Retourne le numéro du bouton de la souris pressé pendant
+ * le dernier appel à {@link #waitMousePress()}.
+ *
+ * @return numéro de bouton (1: gauche, 2: milieu, 3: droit)
+ */
+ public int getMouseButton() {
+ return mouseButton;
}
/**
@@ -346,8 +517,7 @@ public class DrawingWindow {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
WindowEvent ev =
- new WindowEvent(frame,
- WindowEvent.WINDOW_CLOSING);
+ new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit()
.getSystemEventQueue().postEvent(ev);
}
@@ -359,8 +529,11 @@ public class DrawingWindow {
* Suspend l'exécution pendant un certain temps.
*
* @param secs temps d'attente en seconde
+ *
+ * @see #msleep
+ * @see #usleep
*/
- static void sleep(long secs) {
+ public static void sleep(long secs) {
try {
Thread.sleep(secs * 1000);
}
@@ -372,8 +545,11 @@ public class DrawingWindow {
* Suspend l'exécution pendant un certain temps.
*
* @param msecs temps d'attente en millisecondes
+ *
+ * @see #sleep
+ * @see #usleep
*/
- static void msleep(long msecs) {
+ public static void msleep(long msecs) {
try {
Thread.sleep(msecs);
}
@@ -385,8 +561,11 @@ public class DrawingWindow {
* Suspend l'exécution pendant un certain temps.
*
* @param usecs temps d'attente en microsecondes
+ *
+ * @see #sleep
+ * @see #msleep
*/
- static void usleep(long usecs) {
+ public static void usleep(long usecs) {
try {
Thread.sleep(usecs / 1000, (int)(usecs % 1000) * 1000);
}
@@ -396,35 +575,234 @@ public class DrawingWindow {
/* PRIVATE STUFF FOLLOWS */
+ private static final Map