開発者ドキュメント

Java Swing – 動的に図形を描画する


swing-draw-shapes-3

この記事では、JPanelにランダムにシェイプを適用するアプリケーションを作成します。ユーザーは、アプリケーションがサポートするさまざまな図形と描画される量の中から選択できます。設計上の決定として、アプリケーションは円と星を作ることができます。サンプルの最後にサンプルをダウンロードし、より多くの図形、ランダムな色、ランダムなサイズなどを試してみることができます。

1.サークル

コンストラクタは円のx座標とy座標を受け取り、直径は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.スター

スターを描画するには `GeneralPath`クラスを使います。私たちは、 `GeneralPath`が星を描くために従わなければならないx座標とy座標の2つの配列を持っています。

行は(9,0)から始まり、一連のポイントを通過して(3,18)、最後に「closePath()」は「開始位置に戻る」を意味します。


Java’s coordinate system

を使用してこれを紙の上に描画すると、星があります!星を描く方法は一つもありません。あなたは数字で遊んで自分の星や他の形を作ることもできます!

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メソッド`では、ユーザーにシェイプの量と種類を尋ね、 `JFrame`を作成し、

DynamicShapes`クラスの呼び出しで

JPanel`を初期化します。 `JPanel`を拡張する

DynamicShapes`クラスは、

List`に追加されたシェイプを

paintComponent()

メソッドを通して描画します。 `List`は

DynamicShapes`クラスのコンストラクタから生成されます。このクラスはユーザの入力に応じて各シェイプのメソッドを呼び出します。

DynamicShapes.java

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<Object> 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」と入力し、「OK」をクリックします。



[両方]を選択し、[OK]をクリックします。



結果は100個の星と100個の円が `JPanel`内にランダムに配置されます:



すべての組み合わせで

100シェイプ:



ソースコードをダウンロードする

ダウンロード:

DrawShapesDynamically.zip

(4 KB)

モバイルバージョンを終了