@634

おえかき その7 図形描画

Advertisement

どーすっか。

直線に加えて四角形楕円を書けるようにして、まぁ今は、そんぐらいでいいか。フリーハンドとか、そーゆーのはまたいつかやろう。

クラス再設計

矩形のクラスと楕円のクラスを新しく作るんだけど、「座標の変数」が同じ感じだから(全部引数4個。)、スーパークラスをつくろう。
そんで、このクラスのすべてのサブクラスは図形描画のメソッドをもつから、Draw()という名前のメソッドを、実装必須にする(abstract)。

スーパークラス
abstract class Figure{
    protected int sx;
    protected int sy;
    protected int ex;
    protected int ey;

    public Figure(int x1, int y1, int x2, int y2){
        sx = x1;
        sy = y1;
        ex = x2;
        ey = y2
    }

    abstract void Draw(Graphics g);
}

直線クラス
class LineData extends Figure{
    public LineData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawLine(x1, y1, x2, y2);
    }
}

矩形クラス
class RectData extends Figure{
    public RectData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawRect(sx<ex?sx:ex, sy<ey?sy:ey,
                     Math.abs(sx-ex), Math.abs(sy-ey));
    }
}

楕円クラス
class OvalData extends Figure{
    public OvalData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawOval(sx<ex?sx:ex, sy<ey?sy:ey,
                     Math.abs(sx-ex), Math.abs(sy-ey));
    }
}

図形選択を実装しましょ

やるコト:メニュー「直線」「矩形」「楕円」を増やす。描画用フラグ追加(int型)。んー、それだけだ。

流れ
1:図形選択。プログラム起動時は直線。
2:選ばれた図形が直線ならフラグに0を、矩形ならフラグに1を、楕円ならフラグに2を代入。
3:マウスクリック。
4:ドラッグして離したときに、フラグの状態によって生成するオブジェクトを選択する。
5:Vectorに追加。
6:再描画
7:描画時、Vectorの要素を先頭から順番に呼び出してDraw()メソッドを呼び出す。この時、オブジェクトがObject型で返ってくるからinstanceofでオブジェクトの型判定。すべての図形クラスの親クラスであるFigureクラスにキャストする。(2003.3.26訂正)
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Gr{
    public static void main(String args[]){
        mainFrame f = new mainFrame();
        f.setSize(400, 300);
        f.setTitle("タイトル");
        f.show();
    }
}

class mainFrame extends Frame implements WindowListener,
                                MouseListener, ActionListener{
    int x, y;
    int figureFlag;

    Vector v1 = new Vector();
    MenuBar mb = new MenuBar();
    Menu file, edit, help;
    Menu figure;
    MenuItem quit;
    MenuItem undo, clear, line, rect, oval;

    mainFrame(){
        figureFlag = 0;

        file = new Menu("ファイル");
        edit = new Menu("編集");
        help = new Menu("ヘルプ");

        figure = new Menu("図形選択");

        quit = new MenuItem("終了");
        undo = new MenuItem("元に戻す");
        clear = new MenuItem("画面消去");
        line = new MenuItem("直線");
        rect = new MenuItem("四角形");
        oval = new MenuItem("楕円");

        figure.add(line);
        figure.add(rect);
        figure.add(oval);

        file.add(quit);
        edit.add(undo);
        edit.addSeparator();  //セパレータ
        edit.add(figure);
        edit.add(clear);

        mb.add(file);
        mb.add(edit);
        mb.add(help);
        mb.setHelpMenu(help);

        setMenuBar(mb);

        line.addActionListener(this);
        rect.addActionListener(this);
        oval.addActionListener(this);
        clear.addActionListener(this);
        undo.addActionListener(this);

        addWindowListener(this);
        addMouseListener(this);
    }

    public void paint(Graphics g){

        // 2003.3.26訂正
        /*(旧)
        for(int i = 0; i < v1.size(); i++){
            if(v1.elementAt(i) instanceof LineData){
                ((LineData)v1.elementAt(i)).Draw(g);
            }else if(v1.elementAt(i) instanceof RectData){
                ((RectData)v1.elementAt(i)).Draw(g);
            }else{
                ((OvalData)v1.elementAt(i)).Draw(g);
            }
        }
        */

        //(新)ポリモーフィズムの実現。
        //図形追加時に処理を増やさなくてもよい。
        for(int i = 0; i < v1.size(); i++){
            ((Figure)v1.elementAt(i)).Draw(g);
        }
    }

    public void mousePressed(MouseEvent e){
    	x = e.getX();
    	y = e.getY();
    }

    public void mouseReleased(MouseEvent e){
        if(figureFlag == 0){
            v1.addElement(new LineData(x, y, e.getX(), e.getY()));
        }else if(figureFlag == 1){
            v1.addElement(new RectData(x, y, e.getX(), e.getY()));
        }else if(figureFlag == 2){
            v1.addElement(new OvalData(x, y, e.getX(), e.getY()));
        }
        repaint();
    }

    public void windowClosing(WindowEvent e){
        System.exit(0);
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == quit){
            System.exit(0);
        }

        if(e.getSource() == undo && v1.size() > 0){
            v1.remove(v1.size()-1);
            repaint();
        }

        if(e.getSource() == clear){
            v1.removeAllElements();
            repaint();
        }

        if(e.getSource() == line){
            figureFlag = 0;
        }else if(e.getSource() == rect){
            figureFlag = 1;
        }else if(e.getSource() == oval){
            figureFlag = 2;
        }
    }


    public void windowOpened(WindowEvent e){}
    public void windowClosed(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeactivated(WindowEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}
}

abstract class Figure{
    protected int sx;
    protected int sy;
    protected int ex;
    protected int ey;

    public Figure(int x1, int y1, int x2, int y2){
        sx = x1;
        sy = y1;
        ex = x2;
        ey = y2;
    }

    abstract void Draw(Graphics g);
}

class LineData extends Figure{
    public LineData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawLine(sx, sy, ex, ey);
    }
}

class RectData extends Figure{
    public RectData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawRect(sx<ex?sx:ex, sy<ey?sy:ey,
                      Math.abs(sx-ex), Math.abs(sy-ey));
    }
}

class OvalData extends Figure{
    public OvalData(int x1, int y1, int x2, int y2){
        super(x1, y1, x2, y2);
    }

    public void Draw(Graphics g){
        g.drawOval(sx<ex?sx:ex, sy<ey?sy:ey,
                       Math.abs(sx-ex), Math.abs(sy-ey));
    }
}

結果
実行結果

それなりに形になってきた(っぽい)

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール