WaveRing ( Source Code )
Last-Modified: 2008-01-03 01:52:36
ちょっとした説明
この"WaveRing"は以下の3つのクラスからできています。
- WaveRing
- 波紋をあらわすクラスです。
- WaveRingPanel
- メインのパネルです。イベントリスナーが内部クラスとして含まれています。
- WaveApplet
- アプレットです。
WaveRing
- public class WaveRing implements Runnable {
- /**フィールド*/
- private int xPoint, yPoint, radius;
- //波紋のX座標、Y座標、直径
- WaveRingPanel panel;
- static int GrowRate = 10;//直径の増加
- static int Wait = 30;//描画間隔
- /**コンストラクタ*/
- /**
- * 指定された場所に指定された半径のWaveRingを生成
- * @param x int X座標
- * @param y int Y座標
- * @param r int 直径
- */
- public WaveRing(int x, int y, int r) {
- xPoint = x;
- yPoint = y;
- radius = r;
- }
- /**
- * 指定された場所に半径1のWaveRingを生成
- * @param x int X座標
- * @param y int Y座標
- */
- public WaveRing(int x, int y) {
- this(x, y, 1);
- }
- /**(100,100)に半径1のWaveRingを生成*/
- public WaveRing() {
- this(100, 100);
- }
- /**メソッド*/
- /**
- * panelをセット
- * @param wrp WaveRingPanel
- */
- void setPanel(WaveRingPanel wrp) {
- this.panel = wrp;
- }
- /**パネルがセットされているかチェック*/
- void pcheck() {
- if (this.panel == null) {
- System.out.println(
- "You need to add a WaveRing to a Panel befor you use it!!");
- System.exit(1);
- }
- }
- /**
- * 波紋を見せる
- * @param wait int
- */
- public void showRing(int wait) {
- panel.paintImmediately(0, 0, panel.getWidth(), panel.getHeight());
- //即再描画
- try {
- Thread.sleep(wait);//ちょっと休む
- } catch (InterruptedException e) {
- }
- }
- /**波紋を作る*/
- public void makeRing() {
- while (radius / 2 <= maxDistance()) {
- showRing(Wait);//波紋を見せて
- grow();//波紋の直径を大きくする
- }
- showRing(Wait);
- }
- public void run() {
- makeRing();
- panel.remove(this);
- }
- /**直径を増やす*/
- public void grow() {
- radius = radius + GrowRate;
- }
- public void grow(int rate) {
- radius = radius + rate;
- }
- /**直径を返す*/
- public int getR() {
- return radius;
- }
- /**x座標を返す*/
- public int getX() {
- return xPoint;
- }
- /**y座標を返す*/
- public int getY() {
- return yPoint;
- }
- /**壁との最大距離を返す*/
- public int maxDistance() {
- int xx, yy;
- pcheck();
- if (getX() > panel.getWidth() / 2) {
- xx = getX();
- } else {
- xx = panel.getWidth() - getX();
- }
- if (getY() > panel.getHeight() / 2) {
- yy = getY();
- } else {
- yy = panel.getHeight() - getY();
- }
- return (int) (Math.sqrt(xx * xx + yy * yy));
- }
- }
WaveRingPanel
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.util.Vector;
- public class WaveRingPanel extends JPanel {
- /**フィールド*/
- static final Color BackGroundColor = new Color(20, 150, 255);
- //パネルの背景色
- Vector rings = new Vector(10);//WaveRing をしまうVector
- /**コンストラクタ*/
- /**
- * 幅width,高さheightのWaveRingPanelを作成
- * @param width int 幅
- * @param height int 高さ
- */
- public WaveRingPanel(int width,int height) {
- setBackground(BackGroundColor); //背景の色を設定
- setPreferredSize(new Dimension(width, height));
- // パネルの推奨サイズを設定
- addMouseListener(new WaveRingEvent(this));
- //イベントリスナーを設定
- }
- /**幅300,高さ300のWaveRingPanelを作成*/
- public WaveRingPanel(){
- this(300,300);
- }
- /**メソッド*/
- protected void paintComponent(Graphics g) {//描く内容
- super.paintComponent(g);
- g.setColor(Color.BLACK);
- for (int i=0;i<rings.size();i++){
- //ringsにしまわれているWaveringを1個ずつ取り出して
- WaveRing ring = (WaveRing)rings.elementAt(i);
- g.drawOval(ring.getX() - ring.getR() / 2,//円を描く
- ring.getY() - ring.getR() / 2,
- ring.getR(), ring.getR());
- }
- }
- /**
- * WaveRing をこのフレームの上に追加する。
- * @param wr WaveRing 追加するWaveRing
- */
- public void add(WaveRing wr){
- rings.addElement(wr);
- wr.setPanel(this);
- }
- /**
- * WaveRing をこのフレームから取り除く。
- * @param wr WaveRing 取り除くWaveRing
- */
- public void remove(WaveRing wr){
- rings.removeElement(wr);
- paintImmediately(0,0,this.getWidth(),this.getHeight());
- }
- /**メイン*/
- public static void main(String args[]){
- WaveRingPanel wrp= new WaveRingPanel();
- JFrame frame=new JFrame("WaveRing");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- //ウィンドウを閉じたときプログラムを終了
- Container content = frame.getContentPane();
- content.add(wrp);
- frame.pack();
- frame.setVisible(true);//frameを可視化
- }
- /**イベント処理用クラス*/
- class WaveRingEvent extends MouseAdapter {
- WaveRingPanel wavePanel;
- public WaveRingEvent(WaveRingPanel wp) {
- wavePanel = wp;
- }
- public void mouseClicked(MouseEvent e) {
- //マウスがクリックされたら
- WaveRing r = new WaveRing(e.getX(),e.getY());
- //WaveRingを作って
- wavePanel.add(r);//パネルに加え
- Thread t = new Thread(r);
- t.start();//円を描かせる
- }
- }
- }
Wave
- import java.awt.*;
- import javax.swing.*;
- public class WaveApplet extends JApplet {
- WaveRingPanel wrp;
- public void init(){
- wrp = new WaveRingPanel();
- Container c = getContentPane();
- c.add(wrp);
- }
- }