Erstellen von Leinwänden mit Java Swing

Mehvish Ashiq 15 Februar 2024
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:

Leinwand mit Java Swing erstellen - auf Leinwand zeichnen

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:

Leinwand mit Java Swing erstellen - programmgesteuert auf Leinwand zeichnen

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

Verwandter Artikel - Java Swing