Fractalet ( Source Code )
Last-Modified: 2008-01-03 20:23:40
ちょっとした説明
この"Fractalet"は以下の4つのクラスからできています。
- Revi
- レビィ曲線を表示させるメインパネルです。
- SubPanel
- ボタンやラベルなどのGUIを持つサブパネルです。
- ReviEvent
- イベント処理用のクラスです。
- Fractalet
- アプッレトです。
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);//可視化 } }