Java Swing - Zeichne Formen dynamisch Beispiel

Java Swing - Zeichnen Sie Formen dynamisch als Beispiel

swing-draw-shapes-3

In diesem Artikel erstellen wir eine Anwendung, die zufällig Formen aufJPanel legt. Der Benutzer kann zwischen den verschiedenen Formen wählen, die unsere Anwendung unterstützt, sowie dem Betrag, der gezeichnet wird. Als Entwurfsentscheidung kann unsere Anwendung Kreise und Sterne bilden. Sie können das Beispiel am Ende des Artikels herunterladen und mit mehr Formen, zufälligen Farben, zufälligen Größen usw. experimentieren.

1. Der Kreis

Der Konstruktor empfängt die x- und y-Koordinaten des Kreises, während der Durchmesser auf 10 Pixel eingestellt ist.

Circle.java

package com.techfou.dynamicshapes;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;

public class Circle {

    int x, y, width, height;

    public Circle(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void draw(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        Ellipse2D.Double circle = new Ellipse2D.Double(x, y, 10, 10);

        g2d.setColor(Color.GRAY);
        g2d.fill(circle);
    }

}

2. Der Stern

Um den Stern zu zeichnen, verwenden wir die KlasseGeneralPath. Wir haben zwei Arrays für x- und y-Koordinaten, denenGeneralPath folgen muss, um den Stern zu zeichnen. Die Linie beginnt bei (9,0) und bewegt sich durch die Menge der Punkte, um (3,18) und schließlichclosePath() zu erreichen, was bedeutet, dass Sie „dorthin zurückkehren, wo wir begonnen haben“.

Zeichnen Sie dies mitJava’s coordinate system auf Papier und Sie erhalten einen Stern! There is not one way to draw a star. You can play around with the numbers and make your own star, or other shapes even!

Star.java

package com.techfou.dynamicshapes;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;

public class Star {

    int x, y, width, height;

    public Star(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void draw(Graphics g) {
        int xPoints[] = {9, 15, 0, 18, 3};
        int yPoints[] = {0, 18, 6, 6, 18};

        Graphics2D g2d = (Graphics2D) g;
        GeneralPath star = new GeneralPath();

        star.moveTo(xPoints[0] + x, yPoints[0] + y);
        for (int i = 1; i < xPoints.length; i++) {
            star.lineTo(xPoints[i] + x, yPoints[i] + y);
        }
        star.closePath();

        g2d.setColor(Color.YELLOW);
        g2d.fill(star);
    }
}

3. Die Anwendung

Inmain method fragen wir den Benutzer nach der Anzahl und Art der Formen, erstellen dann dieJFrame und initialisieren dieJPanel mit einem Aufruf der KlasseDynamicShapes. DieDynamicShapes-Klasse, dieJPanel erweitert, zeichnet durchpaintComponent()-Methode die Formen, die zuList hinzugefügt wurden. List wird vom Konstruktor der KlasseDynamicShapes ausgefüllt, der die Methode für jede Form gemäß Benutzereingaben aufruft.

DynamicShapes.java

package com.example.dynamicshapes;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class DynamicShapes extends JPanel {

    private List shapes = new ArrayList<>();
    private Random random = new Random();

    public DynamicShapes(int i, String shape) {
        setBackground(Color.BLACK);
        setPreferredSize(new Dimension(400, 400));

        switch (shape) {
            case "Circles":
                for (int j = 0; j < i; j++) {
                    addCircle(390, 390);
                }
                break;
            case "Stars":
                for (int j = 0; j < i; j++) {
                    addStar(380, 380);
                }
                break;
            case "Both":
                int mid = i / 2;
                for (int j = 0; j < mid; j++) {
                    addCircle(390, 390);
                }
                for (int j = mid; j < i; j++) {
                    addStar(380, 380);
                }
                break;
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Object s : shapes) {
            if (s instanceof Circle) {
                ((Circle) s).draw(g);
            } else if (s instanceof Star) {
                ((Star) s).draw(g);
            }
        }
    }

    public void addCircle(int maxX, int maxY) {
        shapes.add(new Circle(random.nextInt(maxX), random.nextInt(maxY)));
        repaint();
    }

    public void addStar(int maxX, int maxY) {
        shapes.add(new Star(random.nextInt(maxX), random.nextInt(maxY)));
        repaint();
    }

    public static void main(String[] args) {

        String shapeAmount = JOptionPane.showInputDialog(null,
                "How many shapes?", "Random Shapes...", JOptionPane.PLAIN_MESSAGE);
        int amount = Integer.parseInt(shapeAmount);

        String shapes[] = {"Stars", "Circles", "Both"};
        String shape = (String) JOptionPane.showInputDialog(null,
                "Pick the shape you want", "Random Shapes...",
                JOptionPane.PLAIN_MESSAGE, null, shapes, shapes[0]);

        JFrame frame = new JFrame();
        frame.add(new DynamicShapes(amount, shape));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}


Ausgabe:

Geben Sie "200" ein und klicken Sie auf "OK".

swing-draw-shapes-1

Wählen Sie "Beide" und klicken Sie auf "OK".

swing-draw-shapes-2

Das Ergebnis sind 100 Sterne und 100 Kreise, die zufällig inJPanel platziert sind:

swing-draw-shapes-3

100 Formen in allen Kombinationen:

swing-draw-shapes-4

Quellcode herunterladen

Herunterladen -DrawShapesDynamically.zip (4 KB)