Java Swing - пример рисования динамически

Java Swing - пример динамического рисования фигур

swing-draw-shapes-3

В этой статье мы создаем приложение, которое случайным образом помещает фигуры вJPanel. Пользователь может выбирать между различными формами, поддерживаемыми нашим приложением, а также размером, который будет нарисован. В качестве дизайнерского решения наше приложение может делать круги и звездочки. Вы можете скачать пример в конце статьи и поэкспериментировать с другими формами, случайными цветами, случайными размерами и т. Д.

1. Круг

Конструктор получает координаты x и y круга, а диаметр установлен на 10 пикселей.

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. Звезда

Чтобы нарисовать звезду, мы используем классGeneralPath. У нас есть два массива для координат x и y, которым должен следоватьGeneralPath, чтобы нарисовать звезду. Линия начинается с (9,0) и проходит через набор точек, чтобы достичь (3,18) и, наконец,closePath(), что означает «вернуться туда, откуда мы начали».

Нарисуйте это на бумаге, используяJava’s coordinate system, и у вас будет звезда! 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. Приложение

Вmain method мы спрашиваем у пользователя количество и тип фигур, затем создаемJFrame и инициализируемJPanel с помощью вызова классаDynamicShapes. КлассDynamicShapes, расширяющийJPanel, через методpaintComponent() рисует формы, которые были добавлены кList. List заполняется конструктором классаDynamicShapes, который вызывает метод для каждой формы в соответствии с вводом пользователя.

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

    }
}


Выход:

Введите «200» и нажмите «ОК».

swing-draw-shapes-1

Выберите «Оба» и нажмите «ОК».

swing-draw-shapes-2

В результате в пределахJPanel случайным образом размещены 100 звезд и 100 кружков:

swing-draw-shapes-3

100 форм во всех комбинациях:

swing-draw-shapes-4

Скачать исходный код

Скачать -DrawShapesDynamically.zip (4 КБ)