Java Swing - Dessine des formes de manière dynamique, par exemple

Java Swing - Exemple de dessin dynamique de formes

swing-draw-shapes-3

Dans cet article, nous créons une application qui place des formes au hasard sur unJPanel. L'utilisateur peut choisir entre les différentes formes prises en charge par notre application ainsi que le montant qui sera tiré. En tant que décision de conception, notre application peut créer des cercles et des étoiles. Vous pouvez télécharger l'exemple à la fin de l'article et expérimenter avec plus de formes, de couleurs aléatoires, de tailles aléatoires, etc.

1. Le cercle

Le constructeur reçoit les coordonnées x et y du cercle tandis que le diamètre est défini sur 10px.

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. L'étoile

Pour dessiner l'étoile, nous utilisons la classeGeneralPath. Nous avons deux tableaux pour les coordonnées x et y que lesGeneralPath doivent suivre pour dessiner l'étoile. La ligne commence à partir de (9,0) et se déplace à travers l'ensemble des points pour atteindre (3,18) et enfinclosePath() qui signifie «retour à l'endroit où nous avons commencé».

Dessinez ceci sur papier en utilisantJava’s coordinate system et vous aurez une étoile! 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. L'application

Dans lesmain method, nous demandons à l'utilisateur la quantité et le type de formes, puis créons lesJFrame et initialisons lesJPanel avec un appel à la classeDynamicShapes. La classeDynamicShapes qui étendJPanel dessine via la méthodepaintComponent() les formes qui ont été ajoutées auxList. LeList est rempli par le constructeur de la classeDynamicShapes qui appelle la méthode pour chaque forme en fonction de l'entrée de l'utilisateur.

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);

    }
}


Sortie:

Tapez "200" et cliquez sur "OK"

swing-draw-shapes-1

Sélectionnez "Les deux" et cliquez sur "OK"

swing-draw-shapes-2

Le résultat est 100 étoiles et 100 cercles placés au hasard dans lesJPanel:

swing-draw-shapes-3

100 formes dans toutes les combinaisons:

swing-draw-shapes-4

Télécharger le code source

Télécharger -DrawShapesDynamically.zip (4 KB)