グラフィックへ戻る | サンプル集目次へ戻る

実行結果
PieChartサンプルソース
なんてことない円グラフですが、アンチエイリアスをかけて、きれいに仕上げてます。 やっぱ、見た目は大事っすよね。
PieChart.java
/**
 * 愛のJava256本ノック for Java 5.0
 * Javaサンプルソース ver0.2C "PieChart"
 * PieChart.java 「アンチエイリアスで円グラフをきれいに表示」
 *
 * 2005/09/23 制作:安永ノリカズ
 *
 * 【コンパイル&実行方法】
 *     >javac PieChart.java
 *     >java PieChart
 * 【キーワード】
 *     弧(arc)の塗りつぶし, Java2D, アンチエイリアス(antialias),
 *     Mapインターフェース
 * 【試してみよう】
 *     データを追加してみる。
 *     データの管理にHashMapを使うとどうなるか試してみる。
 *     グラフに、値やパーセンテージも表示する。
 */
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.lang.String;
import java.lang.System;
import java.util.Map;
import java.util.LinkedHashMap;
import javax.swing.JFrame;
import javax.swing.JPanel;
import static java.awt.RenderingHints.KEY_ANTIALIASING;
import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON;

public class PieChart extends JFrame {

    public PieChart() {
        add(new DrawPanel());
    }

    public static void main(String[] A00) {
        JFrame L00 = new PieChart();
        L00.setTitle("円グラフ");
        L00.setDefaultCloseOperation(EXIT_ON_CLOSE);
        L00.setBackground(Color.white);
        L00.pack();
        L00.setResizable(false);
        L00.setVisible(true);
    }
}

class DrawPanel extends JPanel {
    private static final int C00 = 200;
    private static final int C01 = 200;
    private static final int C02 = 20;  // グラフの表示位置(x方向、y方向兼用)
    private static final int C03 = 5;   // 影のずらし間隔(x方向、y方向兼用)
    private static final int C04 = 150;
    private Color I00 = new Color(64, 64, 64);    // 影とふちの色

    private Map<Color, Integer> I01;
    private int I02;

    public DrawPanel() {
        setBackground(Color.white);
        setPreferredSize(new Dimension(C00, C01));

        I01 = new LinkedHashMap<Color, Integer>();
        I01.put(new Color(255, 32, 32), 50);
        I01.put(new Color(64, 192, 32), 18);
        I01.put(new Color(96, 32, 255), 32);
        I01.put(new Color(255, 192, 0), 42);
        I01.put(new Color(0, 192, 255), 15);

        I02 = 0;
        for (int L01 : I01.values()) {
            I02 += L01;
        }
    }

    public void paintComponent(Graphics A00) {
        super.paintComponent(A00);

        Graphics2D L00 = (Graphics2D)A00;
        L00.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);

        L00.setColor(I00);
        L00.fillOval(C02 + C03, C02 + C03, C04, C04);

        int L01 = 90;   // 円グラフの描画開始角度
        int L02 = 0;    // 扇形の中心角
        
        for (Color L03 : I01.keySet()) {
            L02 = Math.round(360f * I01.get(L03) / I02);
            L01 -= L02;
            L00.setColor(L03);
            L00.fillArc(C02, C02, C04, C04, L01, L02);
        }
        // 四捨五入の都合で塗り残しが出た場合の対処
        L00.fillArc(C02, C02, C04, C04, -270, L02);

        L00.setColor(I00);
        L00.drawOval(C02, C02, C04, C04);
    }
}

/* ■ クラスの外でちょっと一言 ■
通常、円グラフは、真上(時計の12時)から右回りに項目を配置しますが、
fillArcメソッドでは、右方向の水平線(時計の3時)を0度として、左回りに中
心角を指定します。その都合で、このサンプルでは、90度(真上)から描画を始め
て、-270度(真上)で終わるという構造になってます。複雑ですが、ヒントを多め
に入れてますんで、頑張って解析してください。

グラフに利用するデータは、色と数値組み合わせたMapで管理しています。Mapに
は追加した順番を保持するLinkedHashMapを採用しました。ちなみに、色をキー
にしてますので、Mapの特性上、同じ色を2度使うことは出来ません。

ウィンドウサイズの指定には、ちょっとした仕掛けがあります。JFrameに対して
setSizeメソッドでサイズを指定すると、枠やタイトルバー込みのサイズになっ
てしまいますよね。今回のサンプルのように、表示領域を中心に寸法を決めたい
場合は、表示パネルに対して、setPreferredSizeメソッドで必要なサイズを指定
して、フレームのpackメソッドを呼べば、この表示領域が収まる、最適なフレー
ムサイズになってくれます。

アンチエイリアスをかけると、描画速度が遅くなりますが、今回のようなアニ
メーションを伴わない図形描画なら、問題ありませんので、見た目優先でどんど
ん利用していっていいと思います。
 */
↑ 先頭へ戻る

安永ノリカズのゲーム制作&Javaサンプル集 / Java初心者用サンプル集『愛のJava256本ノック』