1. Home
  2. Java
  3. Fractalet ( Source Code )

Fractalet ( Source Code )

Last-Modified: 2008-01-03 20:23:40

ちょっとした説明

この"Fractalet"は以下の4つのクラスからできています。

Revi
レビィ曲線を表示させるメインパネルです。
SubPanel
ボタンやラベルなどのGUIを持つサブパネルです。
ReviEvent
イベント処理用のクラスです。
Fractalet
アプッレトです。

jarファイルをダウンロード

Revi

import java.awt.*;
import javax.swing.*;
public class Revi extends JPanel {
    /**フィールド*/
    private int repeat;
    SubPanel sub; //サブパネル
    /**コンストラクタ*/
    public Revi() {
        repeat = 0;
        setBackground(Color.white); //背景色を設定
        setPreferredSize(new Dimension(400, 400)); 
        //パネルの推奨サイズを設定
        sub = new SubPanel(this);
    }
    /**メソッド*/
    /**
     * 描画内容
     * @param g Graphics
     */
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        drawRevi(getWidth() / 3, getHeight() * 3 / 5, 
        getWidth() * 2 / 3,getHeight() * 3 / 5, repeat, g);
         //繰り返し回数がrepeatのレビィ曲線を書く
        sub.setLabel();
    }
    /**
     * 再帰的にレビィ曲線を書く
     * @param oX int 開始位置(X座標)
     * @param oY int 開始位置(Y座標)
     * @param eX int 終了位置(X座標)
     * @param eY int 終了位置(Y座標)
     * @param n int 繰り返し回数
     * @param g Graphics 
     */
    public void drawRevi
    (int oX, int oY, int eX, int eY, int n, Graphics g) {
        if (n == 0) {
            g.drawLine(oX, oY, eX, eY);
        } else {
            int rX, rY;
            rX = (eX + eY + oX - oY) / 2;
            rY = (eY + oX + oY - eX) / 2;
            drawRevi(oX, oY, rX, rY, n - 1, g);
            drawRevi(rX, rY, eX, eY, n - 1, g);
        }
    }
    /**
     * 繰り返し回数を返す
     * @return int 繰り返し回数
     */
    int getRepeat(){
        return repeat;
    }
    /**
     * 繰り返しの回数を一回増やす
     * ただし、20回以上には増やさない、処理が遅いから
     */
    void repeatUp() {
        if (repeat < 20) { //
            repeat++;
        }
    }
    /**繰り返しの回数を一回減らす
     * ただし、0回未満にしない
     */
    void repeatDown() {
        if (repeat > 0) {
            repeat--;
        }
    }
    /**
     * メイン関数
     * @param args String[]特に意味はない
     */
    public static void main(String args[]) {
        JFrame frame = new JFrame("FRACTAL-Revi");
        Revi revi = new Revi();
        Container cont = frame.getContentPane();
        cont.setLayout(new BorderLayout());
        cont.add(revi,BorderLayout.CENTER);
        cont.add(revi.sub,BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        //ウィンドウを閉じたときプログラムを終了
        frame.pack();
        frame.setVisible(true);
    }
}

上に戻る

SubPanel

import java.awt.*;
import javax.swing.*;
    /**サブパネル(ボタンやラベルなど)のクラス*/
    class SubPanel extends JPanel {
        /**フィールド*/
        private JLabel repeatLabel;
        private JButton up, down;
        private Revi revi;
        private ReviEvent fe;
        /**
         * コンストラクタ
         * @param r Revi メインのパネル
         */
        public SubPanel(Revi r) {
            revi = r;
            fe = new ReviEvent(revi);
            repeatLabel = new JLabel();//ボタンやラベルの設定
            up = new JButton("UP");
            down = new JButton("DOWN");
            up.setActionCommand("UP");
            down.setActionCommand("DOWN");
            up.addActionListener(fe);
            down.addActionListener(fe);
            setLabel();
            add(repeatLabel);
            add(up);
            add(down);
        }
        void setLabel() {
            repeatLabel.setText("repaet  = " + revi.getRepeat());
        }
    }

上に戻る

ReviEvent

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public  class ReviEvent implements ActionListener {
    private Revi revi;
    public ReviEvent(Revi r){
        revi = r;
    }
    /**
     * イベントが起きたときの処理内容
     * @param e ActionEvent
     */
    public void actionPerformed(ActionEvent e) {
        String command=e.getActionCommand();
        if(command.equals("UP")){
            revi.repeatUp();
            revi.repaint();
        }
        if(command.equals("DOWN")){
            revi.repeatDown();
            revi.repaint();
        }
    }
}

上に戻る

Fractalet

import java.awt.*;
import javax.swing.*;
public class Fractalet extends JApplet {
    //アプレットの初期化
    public void init(){
        Revi revi = new Revi();//フラクタルを表示するパネルを作る
        Container cont = getContentPane();//コンテントペインを得る
        cont.add(revi,BorderLayout.CENTER);//コンテントペインにReviを追加
        cont.add(revi.sub,BorderLayout.SOUTH);//コンテントペインにsubを追加
        setVisible(true);//可視化
    }
}

上に戻る | Appletに戻る | Javaに戻る | Homeに戻る

Copyright (c) Toru Mano. Last-Modified: 2008-01-03 20:23:40