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メソッドを呼べば、この表示領域が収まる、最適なフレー ムサイズになってくれます。 アンチエイリアスをかけると、描画速度が遅くなりますが、今回のようなアニ メーションを伴わない図形描画なら、問題ありませんので、見た目優先でどんど ん利用していっていいと思います。 */