Erstellen von Leinwänden mit Java Swing
In Java können wir eine Leinwand auf zwei Arten erstellen, mit Java AWT oder Java Swing. Heute lernen wir, wie man mit Java Swing eine Leinwand erstellt und Formen zeichnet.
Verwenden Sie Java Swing, um eine Leinwand zu erstellen
Beispielcode (die Klasse 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
Beispielcode (Die Canvas.java
-Klasse):
// 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);
}
}
Ausgabe:
In der Klasse PaintPanet.java
erweitert
es das JPanel
, um einen festgelegten Bereich zum Zeichnen zu erstellen. Die Klasse Point
repräsentiert die x- und y-Koordinaten.
Wir erstellen ein Objekt der Klasse Point
, um alle Koordinaten jedes Mausziehereignisses zu speichern, während die Klasse Graphics
zum Zeichnen verwendet wird. Für dieses Beispiel verwenden wir ein Array vom Typ Punkt
, das die 10.000 Punkte/Koordinaten enthält, die den Ort speichern, an dem jedes Mausziehereignis stattfindet.
Wir können sehen, dass die paintComponent
diese Koordinaten zum Zeichnen verwendet. Bitte beachten Sie, dass die Instanzvariable mit dem Namen pointCounter
immer noch die Gesamtzahl der Punkte verfolgt, die per Mausziehereignis erfasst wurden.
Sobald es die Grenze von 10.000 erreicht, können wir nicht mehr zeichnen.
Dann registrieren wir den MouseMotionListener
, der auf das Mausbewegungsereignis der PaintPanel
-Klasse hören kann. Innerhalb des Listeners addMouseMotionListener()
erstellen wir ein Objekt der anonymen inneren Klasse, das die Adapterklasse namens MouseMotionAdapter
erweitert.
Warum überschreiben wir mouseDragged
? Da der MouseMotionAdapter
den MouseMotionListener
implementiert, ist das anonyme Objekt der inneren Klasse der MouseMotionListener
. Die anonyme innere Klasse erbt die Standardimplementierungen mouseMoved
und mouseDragged
.
Es implementiert also bereits alle Methoden der Schnittstelle. Die Standardmethode führt jedoch nichts aus, wenn diese aufgerufen werden, weshalb wir mouseDragged
überschreiben, um die Punkte des Mausziehereignisses zu erfassen und sie als Point
-Objekt zu speichern.
Die if
-Anweisung sorgt dafür, dass wir die Punkte im Array nur speichern, wenn wir die Kapazität haben. Die Methode getPoint()
wird aufgerufen, um die Koordinaten abzurufen, an denen das Ereignis stattgefunden hat, sie im Array points
am Index pointCounter
zu speichern und dann auch den pointCounter
zu inkrementieren.
Bevor wir die if
-Anweisung herausholen, verwenden wir die repaint()
-Methode, die die Aktualisierungen des Malzyklus handhabt. Als nächstes erhält die Methode paintComponent
den Parameter von Graphics
, der automatisch aufgerufen wird, wenn das PaintPanel
auf dem Computerbildschirm angezeigt werden soll.
Innerhalb der paintComponent
-Methode rufen wir die Oberklasse der paintComponent
auf, um den Zeichenbereich zu löschen. Denken Sie daran, dass wir das Schlüsselwort super
verwenden, um auf die Methoden und Instanzen der Oberklasse zuzugreifen.
Wir zeichnen ein 5 x 5
-Oval an der angegebenen Stelle durch jeden Punkt in einem Array, das bis zum pointCounter
gehen kann, während die fillOval()
-Methode das solide Oval zeichnet.
Kommen wir nun zu Canvas.java
, der Hauptklasse. Es erstellt die Objekte von JFrame
und PaintPanel
.
Dann verwenden wir die add()
-Methode, um das Objekt des PaintPanel
in der Mitte des JFrame
-Fensters hinzuzufügen. Wir verwenden BorderLayout.CENTER
, um es in der Mitte des JFrame
-Fensters hinzuzufügen.
Als nächstes fügen wir mit BorderLayout.SOUTH
ein Label
im Süden des JFrame
-Fensters hinzu. Danach verwenden wir die Methoden setDefaultCloseOperation()
, setSize()
, setLocationRelativeTo()
und setVisible()
, um das Fenster zu schließen, wenn der Benutzer auf das Kreuzzeichen (X
) klickt, setzen Sie die Größe des JFrame
-Fensters, verschieben Sie das JFrame
-Fenster in die Mitte des Computerbildschirms und zeigen Sie es entsprechend an.
Anstatt manuell auf der Leinwand zu zeichnen, können wir programmgesteuert zeichnen.
Beispielcode (die Klasse Draw.java
hat die Methode 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);
}
}
Ausgabe: