オブジェクト指向人工生命体42010/10/24 00:45

まずは表示

とりあえず、見えないことには話が進まないので、まずは表示から。
人工生命体はJFrame上に配置したJPanelに表示することにしました。JFrame上にステータスバー(もどき)を置こうと思ったので、表示領域 を自由な位置に配置することを考えてJPanelにしました。そして表示は、当然、人工生命体であるところのWarmオブジェクトにやらせること にしました。

1.JFrameウィンドウの作成
 Eclipse+VisualEditorで作成します。
 まず、新規クラスを作成。これは、『普通のJavaプロジェクト』です。
 出来たプロジェクトを右クリックし、『新規』→『ビジュアル・クラス』を選択。
 『新規Javaビジュアル・クラス』ウィンドウが開かれるので、『スタイル』で『Swing・フレーム』を選択。
 『どのメソッド・スタブを作成しますか?』は『public static・・・』を選択。
 パッケージやファイル名は適当に。

2.JPanelの貼り付け
 VisualEditorを使って『Swingコンテナー』のJPanelをjContentPane上に配置します。
 大きさ、その他は適当に。

ここまでで、基本のウィンドウは出来ました。
次は、描画のためのメソッドを追加します。

 描画はコンポーネントのGraphicsオブジェクトに、描画メソッドを使って書きます。したがって、JPanelからgetGraphics()メソッドで Graphicsオブジェクトを取得して、そこに描画をすればOKということになります。・・・が、しかし、これではうまくいきません。なぜ、何がうまくいかないのかというと、・・・
 そもそも、JFrameウィンドウ達(JFrame上に乗ってるパネルやボタンやテキストフィールドなど全て)は、私達の描画だけを相手にしているわけではありません。自分でも、自分自身の描画領域や、配置されたボタンや、ウィンドウの枠を書いたりしています。これも描画です。さらに、自分の上に乗ってた他のウィンドウが動いて自分が画面上に現れた時や、ウィンドウがリサイズされた時にも自分を描画し直します。そして、こういった動きはフレームワークという形で実装・管理されています。
 したがって、私達が自分に都合のよいタイミングで勝手に描画をしても、『あんたの描画なんて聞いてないよっ!』と言われて、上書きされてしまったり、書き直しされなかったりするわけです。
 で、このフレームワークにうまく潜り込んで、うまいこと描画させるために次のことが必要になります。

3.描画用派生クラスの作成
 JPanelクラスの描画部分を乗っ取って、ここで人工生命体を描画させます。ただし、元からあるJPanelクラスの描画を完全に殺してしまっ てはJPanel自体の描画ができなくなってしまいます。したがって、『JPanelクラスの描画を乗っ取って人工生命体を描画するけど、元の JPanelクラスの描画も動かす』ということになります。
 つまり、JPanelクラスの派生クラスを作成し、描画メソッドであるpaintComponent()をオーバーライドし、そこで人工生命体の描画をする けどスーパークラスのpaintComponent()を呼び出して本来のJPanelクラスの描画もさせる、・・・ということになります。  次のソースが元のコードです。JPanel01はJPanelのインスタンスとして使用されています。
public class testFrame extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel jPanel01 = null;
    /**
     * This method initializes jPanel01   
     *    
     * @return javax.swing.JPanel 
     */
    private JPanel getJPanel01() {
        if (jPanel01 == null) {
            jPanel01 = new JPanel();
            jPanel01.setLayout(new GridBagLayout());
            jPanel01.setPreferredSize(new Dimension(270, 130));
            jPanel01.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        }
        return jPanel01;
    }
 これを次のように変更します。(JPanel → DrawPanel)
    private DrawPanel jPanel01 = null;
    /**
     * This method initializes jPanel01   
     *    
     * @return javax.swing.JPanel 
     */
    private JPanel getJPanel01() {
        if (jPanel01 == null) {
            jPanel01 = new DrawPanel();
class DrawPanel extends JPanel {

}
 で、これでJPanelの派生クラスとしてDrawPanelを作ることができました。

 次に、DrawPanelクラスにpaintComponent()をオーバーライドします。これはEclipseの機能で実現できます。
 ソースコードのエディタ上でDrawPanelクラスのDrawPanelの文字を選択状態にします。
 メニューの『ソース』→『メソッドのオーバーライド/実装』を選択します。
 『メソッドをオーバーライド/実装』ウィンドウが開くので、『オーバーライドまたは実装するメソッドを選択:』で『JComponent』の 『PrintComponent()』を選択します。
 ちなみに、JComponentのPrintComponent()を選択するのは、JPanelクラスはJComponentから派生していて PrintComponent()はJComponentクラスのメソッドだからです。以下の図を参照のこと。(javaでプログラムを作るな ら、以下のサイトはバイブルとなるのでブックマークしておきましょう。)
 さて、コードですが、以下の状態になります。
class DrawPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        // TODO 自動生成されたメソッド・スタブ
        super.paintComponent(g);
    }
}
 オーバーライドしたpaintComponent(Graphics g)は引数にGraphicsオブジェクトを持っているので、これに人工生命体を描画します。GraphicsオブジェクトgをWarmクラスの描画関数に渡して描画させます。これでOKです。
class DrawPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        // TODO 自動生成されたメソッド・スタブ
        super.paintComponent(g);

        Warm warm1 = new Warm();
        warm1.DrawWarm(g);
    }
}
public class Warm {

    int x = 80;
    int y = 100;
    int width = 50;
    int height = 50;
    Color warmColor = Color.red;
    
    public void DrawWarm(Graphics g) {
        g.setColor(warmColor);
        g.drawOval(x, y, width, height);        
    }
}
 これで、表示が動くはずです。
 Eclipseの画面上は以下のとおりです。
 で、次回は、Warmの描画を充実させます・・・の予定です。
java,描画,JPanel,paintComponent,Graphics,setColor

イモムシから蝶まで2010/10/24 23:06

 先週、『ベランダの植木鉢の周りに毛虫のうんちが落ちてるっ』との報告あり。調べてみると毛虫ではなくイモムシでした。イモムシって言っても、モンシロチョウの幼虫みたいなやつだったので、そのままにしておくことにしました。どうせ、11月になれば葉が枯れて落ちちゃうしね。好きなだけ食べてください。
 で、良く調べてみるとサナギもありました。とりあえずネタとしてイモムシとサナギの写真を撮っておきました。

 そして今週、見てみると、いろんな状態のイモムシって言うかサナギって言うか蝶って言うのが正しいのか、まぁいろいろなバリエーションを発見しました。同じ個体じゃぁないですけど、こんな感じで成長していくんじゃないかと・・・

 ちなみに、糸で枝からぶらさがってたイモムシは1日でサナギになりました。(・・;)ビックリ!

 結果的に黄色い蝶が出てきてホッとしました。オレンジと紫のまだらの蛾だったりしたらチョットねっ(^^;)

毛虫、イモムシ、幼虫、いろんな単語が出てきますが雰囲気で感じ取ってください。