JavaCurry | サンプルソース | |
---|---|---|
JavaCurryの表示は、「四角」「文字」「円」の3つのクラスから構成されています。黄色い箱がBoxクラス。文字はTextクラスで、同心円はCircleクラスのインスタンスを4つ重ねたもの。ふざけているようで、じつは深い味わいのソースコード。256ノックの真骨頂っす。 |
JavaCurry.java Box.java Text.java Circle.java DrawPanel.java Parts.java |
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * JavaCurry.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * 大塚食品, ボンカレーゴールド * 【試してみよう】 * Box、Circle、Textを上手く組み合わせ、右下にJASマークを入れる。 * http://www.jasnet.or.jp/ */ import java.awt.Color; import java.lang.String; import java.lang.System; import javax.swing.JFrame; public class JavaCurry extends JFrame { public JavaCurry() { add(new DrawPanel()); } public static void main(String[] A00) { JFrame L00 = new JavaCurry(); L00.setTitle("オブジェクト指向レトルトカレー"); L00.setDefaultCloseOperation(EXIT_ON_CLOSE); L00.setBackground(Color.white); L00.pack(); L00.setResizable(false); L00.setVisible(true); } } /* ■ クラスの外でちょっと一言 ■ 本当は、ハウス『ジャワカレー』のパッケージをやりたかったんですが、かなり 複雑で、とてもプリミティブな図形の組み合わせでは表現不可能なため、断腸の 思いで、大塚食品『ボンカレー ゴールド』を題材にしました。 レトルトカレーマニアにつっこまれる前に、言い訳しておきます。 */
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * Box.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * 矩形(rectangle)の描画 * 【試してみよう】 * JavaCurry.java参照 */ import java.awt.Color; import java.awt.Graphics; public class Box implements Parts { int I00; int I01; int I02; int I03; Color I04; Box(int A00, int A01, int A02, int A03, Color A04) { this.I00 = A00; this.I01 = A01; this.I02 = A02; this.I03 = A03; this.I04 = A04; } public void M00(Graphics A00) { A00.setColor(I04); A00.fillRect(I00, I01, I02, I03); } } /* ■ クラスの外でちょっと一言 ■ ちなみに、僕は辛いのは苦手な方です。というか、すごく汗をかいてしまいま す。「ココイチ」のカレーでいえば、辛さ普通で結構汗だく。でも、好きなん で、ちょくちょく食べに行ってます。よく注文するのは「チキンカツカレー」で すね。 */
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * Text.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * 論理(logical)フォントと物理(physical)フォント * 【試してみよう】 * JavaCurry.java参照 */ import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.lang.String; public class Text implements Parts { String I00; int I01; int I02; Color I03; int I04; Text(String A00, int A01, int A02, Color A03, int A04) { this.I00 = A00; this.I01 = A01; this.I02 = A02; this.I03 = A03; this.I04 = A04; } public void M00(Graphics A00) { A00.setColor(I03); A00.setFont(new Font("SansSerif", Font.BOLD, I04)); A00.drawString(I00, I01, I02); } } /* ■ クラスの外でちょっと一言 ■ 福岡ローカルの話になって申し訳ないんですが、天神西通りのケンタッキーの上 に、「ツナパハ」というカレー屋さんがあります。そこの「ドライカリー」は (少なくとも自分にとっては)かなり辛いんですが、とっても美味しいです。デ ジハリ福岡校が大名にあった頃、ランチでよく食べましたね。 その店に、辛さの指定で「デビルレッド」という項目があります。いかにも辛そ うな名前で、実際にすごく辛いです。あと、昔、親不孝通りにあった「タージ」 という店には「青酸カリー」というメニューがありました。死ぬほど辛いんで しょうね。で、これも今はなくなった店ですが、天神ビル地下の「サムソン」に は、「W死に辛」という辛さ指定がありました。もちろん、どれも食べたことは ありません。 */
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * Circle.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * 楕円(oval)の描画 * 【試してみよう】 * JavaCurry.java参照。 */ import java.awt.Color; import java.awt.Graphics; public class Circle implements Parts { int I00; int I01; int I02; Color I03; Circle(int A00, int A01, int A02, Color A03) { this.I00 = A00; this.I01 = A01; this.I02 = A02; this.I03 = A03; } public void M00(Graphics A00) { A00.setColor(I03); A00.fillOval(I00, I01, I02, I02); } } /* ■ クラスの外でちょっと一言 ■ このサンプルを作るにあたり、「ボンカレーのパッケージってどんなんだっ け?」ということで、早速、近所のスーパー(ゆめタウン宗像店)へ調査に行き ました。しかし、僕の記憶にある『ボンカレー ゴールド』はもうそこにはな く、『ボンカレー ゴールド21』へとバージョンアップしてるではないです か! しかも、パッケージの「丸」が、微妙に立体的で、テカリまで入ってる じゃないですか! とりあえず見なかったことにして、スーパーを後にしました……。 */
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * DrawPanel.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * アンチエイリアス(antialias) * 【試してみよう】 * JavaCurry.java参照。 */ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import static java.awt.RenderingHints.KEY_ANTIALIASING; import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON; public class DrawPanel extends JPanel { static final int C00 = 280; static final int C01 = 360; static final Color C02 = new Color(170, 0, 0); static final Color C03 = new Color(250, 190, 20); static final Color C04 = new Color(240, 30, 0); static final Color C05 = new Color(240, 70, 0); List<Parts> I00; public DrawPanel() { setBackground(Color.white); setPreferredSize(new Dimension(C00, C01)); I00 = new ArrayList<Parts>(); I00.add(new Box(10, 10, 260, 340, C03)); I00.add(new Text("ジャバカレー", 25, 62, C02, 36)); I00.add(new Text("JAVA CURRY GOLD ゴールド", 30, 84, C02, 16)); I00.add(new Text("辛さ256倍", 176, 100, Color.red, 16)); I00.add(new Text("200g・1人分", 25, 330, Color.black, 10)); I00.add(new Circle(30, 105, 220, C02)); I00.add(new Circle(60, 135, 160, C04)); I00.add(new Circle(80, 155, 120, C05)); I00.add(new Circle(100, 175, 80, C03)); } public void paintComponent(Graphics A00) { super.paintComponent(A00); Graphics2D L00 = (Graphics2D)A00; L00.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON); for (Parts L01 : I00) { L01.M00(L00); } } } /* ■ クラスの外でちょっと一言 ■ 「Javaカレーゴールド」の表示は、「四角」「文字」「円」の3種類のパーツを 組み合わせて実現しています。表示されている文字は、すべてTextクラスのイン スタンスで、同心円は、Circleクラスのインスタンスを4つ重ねたものです。 そんな具合に、違うクラスから派生したインスタンスですが、最終的にはどれも Parts型として一括管理されています。これは、Box, Text, Circleそれぞれのク ラスがPartsインターフェースを実装しているからこそなせるわざ。別々のクラ スでも、共通要素をインターフェースに抽出することで「同じ種類もの」として 管理することが出来ます。 とにかく、オブジェクト指向を理解してもらうのに、こんなサンプル作るのは、 自分くらいのもんだろうと、つくづく(でもちょっぴり誇りに)思っています。 何年か後に「JavaCurryでオブジェクト指向の意味を理解しました」というプロ グラマが現れることを、心より願ってやみません。 */
/** * 愛のJava256本ノック for Java 5.0 * Javaサンプルソース ver0.2C "JavaCurry" * Parts.java 「カレーのパッケージをオブジェクト指向で表現」 * * 2005/09/23 制作:安永ノリカズ * * 【コンパイル&実行方法】 * >javac *.java * >java JavaCurry * 【キーワード】 * インターフェース(interface) * 【試してみよう】 * JavaCurry.java参照。 */ import java.awt.Graphics; public interface Parts { public void M00(Graphics A00); } /* ■ クラスの外でちょっと一言 ■ インターフェースとは、クラスの「振る舞い方」のみを定義するものです。この Partsインターフェースは、「Graphicsオブジェクトを受け取って、描画する」 という動作を定義していますので、M00には「いかにも描画しそう」な名前をつ けてあげてください。 具体的にどのように描画するかは、このインターフェースを実装している、Box, Circle, Textの各クラスでそれぞれ記述してます。 JavaCurryでは、このPartsインターフェースが、ピリッと効いたスパイスになっ てますので、DrawPanel.javaにて、このインターフェースがどのように利用され てるのか、その風味をじっくりご賞味ください。 */