Рубрики
Без рубрики

Java Swing – Динамический пример рисования фигур

– Java Swing – Рисование фигур динамический пример

Автор оригинала: Marilena.

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

1. Круг

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

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

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

Нарисуйте это на бумаге с помощью Система координат Java и у тебя будет звезда! Существует не один способ нарисовать звезду. Вы можете поиграть с цифрами и сделать свою собственную звезду или даже другие фигуры!

package com.mkyong.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 мы запрашиваем у пользователя количество и тип фигур, затем создаем JFrame и инициализируем JPanel вызовом класса DynamicShapes . Класс Динамические фигуры , который расширяет JPanel , рисует с помощью метода paintComponent() фигуры, которые были добавлены в Список . Список заполняется из конструктора класса Dynamic Shapes , который вызывает метод для каждой фигуры в соответствии с вводом пользователя.

package com.mkyong.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” и нажмите “ОК”.

Выберите “Оба” и нажмите “ОК”.

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

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

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

Рекомендации

  1. Учебник по координатам Java
  2. java.awt.геом. Общий путь JavaDoc
  3. джавакс, качели. JPanel JavaDoc-панель

Оригинал: “https://mkyong.com/swing/java-swing-draw-shapes-dynamically-example/”