おえかき その9 図形を増やそう
かける図形をふやそー
色が選択できるようになったから、塗りつぶした図形をかけるようにしよ。
図形増やして、あーそうだ。図形のCheckboxItemMenuも配列化しちゃお。ほら、さらに増やすときに、すっげーラクだからさ。
図形増やして、あーそうだ。図形のCheckboxItemMenuも配列化しちゃお。ほら、さらに増やすときに、すっげーラクだからさ。
やるぜ
配列化とかリスナ登録とかは前回と同じ感じ。
図形のクラスが2個増える→図形オブジェクト生成の場所(mouseReleased)変更。
ん、それだけだな。
図形のクラスが2個増える→図形オブジェクト生成の場所(mouseReleased)変更。
ん、それだけだな。
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, ItemListener{
int x, y;
int figureFlag;
Color col;
Vector v1 = new Vector();
MenuBar mb = new MenuBar();
Menu file, edit, help;
Menu figure, color;
MenuItem quit, undo, clear;
CheckboxMenuItem[] figItem = new CheckboxMenuItem[5];
CheckboxMenuItem[] colItem = new CheckboxMenuItem[13];
mainFrame(){
int i;
col = Color.black;
figureFlag = 0;
file = new Menu("ファイル");
edit = new Menu("編集");
help = new Menu("ヘルプ");
figure = new Menu("図形選択");
color = new Menu("描画色選択");
quit = new MenuItem("終了", new MenuShortcut(KeyEvent.VK_X, false));
undo = new MenuItem("元に戻す", new MenuShortcut(KeyEvent.VK_Z, false));
clear = new MenuItem("画面消去");
String[] str1 = {"直線","四角形","楕円",
"塗りつぶした四角形","塗りつぶした楕円"};
for(i = 0; i < figItem.length; i++)
figItem[i] = new CheckboxMenuItem(str1[i]);
figItem[0].setShortcut(new MenuShortcut(KeyEvent.VK_L, false));
figItem[1].setShortcut(new MenuShortcut(KeyEvent.VK_R, false));
figItem[2].setShortcut(new MenuShortcut(KeyEvent.VK_O, false));
String[] str2 = {"黒","青","シアン",
"ダークグレイ","グレイ",
"緑","ライトグレイ",
"マゼンダ","オレンジ",
"ピンク","赤","白","黄色"};
for(i = 0; i < colItem.length; i++)
colItem[i] = new CheckboxMenuItem(str2[i]);
for(i = 0; i < figItem.length; i++){figure.add(figItem[i]);}
for(i = 0; i < colItem.length; i++){color.add(colItem[i]);}
file.add(quit);
edit.add(undo);
edit.addSeparator();
edit.add(figure);
edit.add(color);
edit.add(clear);
mb.add(file);
mb.add(edit);
mb.add(help);
mb.setHelpMenu(help);
setMenuBar(mb);
for(i = 0; i < figItem.length; i++){figItem[i].addItemListener(this);}
for(i = 0; i < colItem.length; i++){colItem[i].addItemListener(this);}
quit.addActionListener(this);
clear.addActionListener(this);
undo.addActionListener(this);
addWindowListener(this);
addMouseListener(this);
figItem[0].setState(true);
colItem[0].setState(true);
}
public void paint(Graphics 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(), col));
}else if(figureFlag == 1){
v1.addElement(new RectData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 2){
v1.addElement(new OvalData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 3){
v1.addElement(new FillRectData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 4){
v1.addElement(new FillOvalData(x, y, e.getX(), e.getY(), col));
}
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();
}
}
public void itemStateChanged(ItemEvent e){
if(e.getSource() == figItem[0]){
figureFlag = 0;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[0].setState(true);
}else if(e.getSource() == figItem[1]){
figureFlag = 1;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[1].setState(true);
}else if(e.getSource() == figItem[2]){
figureFlag = 2;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[2].setState(true);
}else if(e.getSource() == figItem[3]){
figureFlag = 3;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[3].setState(true);
}else if(e.getSource() == figItem[4]){
figureFlag = 4;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[4].setState(true);
}
if(e.getSource() == colItem[0]){
col = Color.black;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[0].setState(true);
}else if(e.getSource() == colItem[1]){
col = Color.blue;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[1].setState(true);
}else if(e.getSource() == colItem[2]){
col = Color.cyan;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[2].setState(true);
}else if(e.getSource() == colItem[3]){
col = Color.darkGray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[3].setState(true);
}else if(e.getSource() == colItem[4]){
col= Color.gray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[4].setState(true);
}else if(e.getSource() == colItem[5]){
col = Color.green;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[5].setState(true);
}else if(e.getSource() == colItem[6]){
col = Color.lightGray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[6].setState(true);
}else if(e.getSource() == colItem[7]){
col = Color.magenta;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[7].setState(true);
}else if(e.getSource() == colItem[8]){
col = Color.orange;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[8].setState(true);
}else if(e.getSource() == colItem[9]){
col = Color.pink;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[9].setState(true);
}else if(e.getSource() == colItem[10]){
col = Color.red;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[10].setState(true);
}else if(e.getSource() == colItem[11]){
col = Color.white;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[11].setState(true);
}else if(e.getSource() == colItem[12]){
col = Color.yellow;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[12].setState(true);
}
}
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;
protected Color col;
public Figure(int x1, int y1, int x2, int y2, Color c){
sx = x1;
sy = y1;
ex = x2;
ey = y2;
col = c;
}
abstract void Draw(Graphics g);
}
class LineData extends Figure{
public LineData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.drawLine(sx, sy, ex, ey);
}
}
class RectData extends Figure{
public RectData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
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, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.drawOval(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
class FillRectData extends Figure{
public FillRectData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.fillRect(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
class FillOvalData extends Figure{
public FillOvalData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.fillOval(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
簡単だ。
実行イメージ

選択色で塗りつぶす。
おえかき その12 ファイル保存(簡易版)
書いた絵を保存。
このプログラムで、各図形クラスのオブジェクトをまとめて管理しているのはVectorクラスのオブジェクトだから、そのオブジェクトの状態をそのまま記録しちゃえばいいのさ。
てことで、オブジェクト・シリアライズをつかうー。
今回は保存するファイルが固定だから、作業はたいして多くない。
やるぜ。
やること。
各図形クラスをシリアライズ可能にする。(スーパークラスFigureだけに記述すればOK)
class クラス名 implements Serializable
入出力を使うから、パッケージjava.ioをインポート。
メニューに「開く」「保存」を追加して、選択されたときの処理を記述。
以上。
import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; 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, ItemListener{ int x, y; int figureFlag; Color col; Vector v1 = new Vector(); MenuBar mb = new MenuBar(); Menu file, edit, help; Menu figure, color; MenuItem open, save, quit; MenuItem undo, clear; CheckboxMenuItem[] figItem = new CheckboxMenuItem[5]; CheckboxMenuItem[] colItem = new CheckboxMenuItem[13]; mainFrame(){ int i; col = Color.black; figureFlag = 0; file = new Menu("ファイル"); edit = new Menu("編集"); help = new Menu("ヘルプ"); figure = new Menu("図形選択"); color = new Menu("描画色選択"); open = new MenuItem("開く", new MenuShortcut(KeyEvent.VK_O, false)); save = new MenuItem("保存", new MenuShortcut(KeyEvent.VK_S, false)); quit = new MenuItem("終了", new MenuShortcut(KeyEvent.VK_X, false)); undo = new MenuItem("元に戻す", new MenuShortcut(KeyEvent.VK_Z, false)); clear = new MenuItem("画面消去"); String[] str1 = {"直線","四角形","楕円", "塗りつぶした四角形","塗りつぶした楕円"}; for(i = 0; i < figItem.length; i++){ figItem[i] = new CheckboxMenuItem(str1[i]); } figItem[0].setShortcut(new MenuShortcut(KeyEvent.VK_L, false)); figItem[1].setShortcut(new MenuShortcut(KeyEvent.VK_R, false)); figItem[2].setShortcut(new MenuShortcut(KeyEvent.VK_O, false)); String[] str2 = {"黒","青","シアン", "ダークグレイ","グレイ", "緑","ライトグレイ", "マゼンダ","オレンジ", "ピンク","赤","白","黄色"}; for(i = 0; i < colItem.length; i++){ colItem[i] = new CheckboxMenuItem(str2[i]); } for(i = 0; i < figItem.length; i++){figure.add(figItem[i]);} for(i = 0; i < colItem.length; i++){color.add(colItem[i]);} file.add(open); file.add(save); file.addSeparator(); file.add(quit); edit.add(undo); edit.addSeparator(); edit.add(figure); edit.add(color); edit.add(clear); mb.add(file); mb.add(edit); mb.add(help); mb.setHelpMenu(help); setMenuBar(mb); for(i = 0; i < figItem.length; i++){figItem[i].addItemListener(this);} for(i = 0; i < colItem.length; i++){colItem[i].addItemListener(this);} open.addActionListener(this); save.addActionListener(this); quit.addActionListener(this); clear.addActionListener(this); undo.addActionListener(this); addWindowListener(this); addMouseListener(this); figItem[0].setState(true); colItem[0].setState(true); } public void paint(Graphics 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(), col)); }else if(figureFlag == 1){ v1.addElement(new RectData(x, y, e.getX(), e.getY(), col)); }else if(figureFlag == 2){ v1.addElement(new OvalData(x, y, e.getX(), e.getY(), col)); }else if(figureFlag == 3){ v1.addElement(new FillRectData(x, y, e.getX(), e.getY(), col)); }else if(figureFlag == 4){ v1.addElement(new FillOvalData(x, y, e.getX(), e.getY(), col)); } repaint(); } public void windowClosing(WindowEvent e){ System.exit(0); } public void actionPerformed(ActionEvent e){ if(e.getSource() == save){ try{ FileOutputStream fos = new FileOutputStream("./gr.dat"); ObjectOutputStream oos = new ObjectOutputStream(fos); //データ出力 oos.writeObject(v1); oos.close(); fos.close(); }catch(IOException evt){ System.out.println(evt); //evt.printStackTrace(); //↑こっちだと例外のときにトレース。 } } if(e.getSource() == open){ try{ FileInputStream fis = new FileInputStream("./gr.dat"); ObjectInputStream ois = new ObjectInputStream(fis); //一度削除(いらないっぽい。) v1.removeAllElements(); //データ読み込み v1 = (Vector)ois.readObject(); ois.close(); fis.close(); repaint(); }catch(Exception evt){ System.out.println(evt); //evt.printStackTrace(); } } 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(); } } public void itemStateChanged(ItemEvent e){ if(e.getSource() == figItem[0]){ figureFlag = 0; for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);} figItem[0].setState(true); }else if(e.getSource() == figItem[1]){ figureFlag = 1; for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);} figItem[1].setState(true); }else if(e.getSource() == figItem[2]){ figureFlag = 2; for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);} figItem[2].setState(true); }else if(e.getSource() == figItem[3]){ figureFlag = 3; for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);} figItem[3].setState(true); }else if(e.getSource() == figItem[4]){ figureFlag = 4; for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);} figItem[4].setState(true); } if(e.getSource() == colItem[0]){ col = Color.black; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[0].setState(true); }else if(e.getSource() == colItem[1]){ col = Color.blue; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[1].setState(true); }else if(e.getSource() == colItem[2]){ col = Color.cyan; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[2].setState(true); }else if(e.getSource() == colItem[3]){ col = Color.darkGray; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[3].setState(true); }else if(e.getSource() == colItem[4]){ col= Color.gray; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[4].setState(true); }else if(e.getSource() == colItem[5]){ col = Color.green; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[5].setState(true); }else if(e.getSource() == colItem[6]){ col = Color.lightGray; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[6].setState(true); }else if(e.getSource() == colItem[7]){ col = Color.magenta; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[7].setState(true); }else if(e.getSource() == colItem[8]){ col = Color.orange; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[8].setState(true); }else if(e.getSource() == colItem[9]){ col = Color.pink; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[9].setState(true); }else if(e.getSource() == colItem[10]){ col = Color.red; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[10].setState(true); }else if(e.getSource() == colItem[11]){ col = Color.white; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[11].setState(true); }else if(e.getSource() == colItem[12]){ col = Color.yellow; for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);} colItem[12].setState(true); } } 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 implements Serializable{ protected int sx; protected int sy; protected int ex; protected int ey; protected Color col; public Figure(int x1, int y1, int x2, int y2, Color c){ sx = x1; sy = y1; ex = x2; ey = y2; col = c; } abstract void Draw(Graphics g); } class LineData extends Figure{ public LineData(int x1, int y1, int x2, int y2, Color c){ super(x1, y1, x2, y2, c); } public void Draw(Graphics g){ g.setColor(col); g.drawLine(sx, sy, ex, ey); } } class RectData extends Figure{ public RectData(int x1, int y1, int x2, int y2, Color c){ super(x1, y1, x2, y2, c); } public void Draw(Graphics g){ g.setColor(col); 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, Color c){ super(x1, y1, x2, y2, c); } public void Draw(Graphics g){ g.setColor(col); g.drawOval(sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)); } } class FillRectData extends Figure{ public FillRectData(int x1, int y1, int x2, int y2, Color c){ super(x1, y1, x2, y2, c); } public void Draw(Graphics g){ g.setColor(col); g.fillRect(sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)); } } class FillOvalData extends Figure{ public FillOvalData(int x1, int y1, int x2, int y2, Color c){ super(x1, y1, x2, y2, c); } public void Draw(Graphics g){ g.setColor(col); g.fillOval(sx<ex?sx:ex, sy<ey?sy:ey, Math.abs(sx-ex), Math.abs(sy-ey)); } }
実行イメージ

「開く」と「保存」だからイメージも何もないんだけどな。で、いま気づいたんだけど、タイトルがずーっと「タイトル」のままだ。あちゃ。あー、あと保存する前にファイル開こうとするとFileNotFoundException(リンク先:java.sun.com)が発生する。
おえかき その13 ファイル保存(ダイアログ版)
保存と開くのダイアログ
FileDialog使って「保存」と「開く」のためのダイアログ作ってフルパスでファイル名取得して保存。以上。
あ、おっちゃんは拡張子フィルターのリストのとこの設定がわからん。できないのかな。
ま、つくっちゃお。
とりあえず、のコード掲載
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
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, ItemListener{
int x, y;
int figureFlag;
Color col;
Vector v1 = new Vector();
MenuBar mb = new MenuBar();
Menu file, edit, help;
Menu figure, color;
MenuItem open, save, quit;
MenuItem undo, clear;
CheckboxMenuItem[] figItem = new CheckboxMenuItem[5];
CheckboxMenuItem[] colItem = new CheckboxMenuItem[13];
OpenDialog od = new OpenDialog();
SaveDialog sd = new SaveDialog();
mainFrame(){
int i;
col = Color.black;
figureFlag = 0;
file = new Menu("ファイル");
edit = new Menu("編集");
help = new Menu("ヘルプ");
figure = new Menu("図形選択");
color = new Menu("描画色選択");
open = new MenuItem("開く", new MenuShortcut(KeyEvent.VK_O, false));
save = new MenuItem("保存", new MenuShortcut(KeyEvent.VK_S, false));
quit = new MenuItem("終了", new MenuShortcut(KeyEvent.VK_X, false));
undo = new MenuItem("元に戻す",
new MenuShortcut(KeyEvent.VK_Z, false));
clear = new MenuItem("画面消去");
String[] str1 = {"直線","四角形","楕円",
"塗りつぶした四角形","塗りつぶした楕円"};
for(i = 0; i < figItem.length; i++)
figItem[i] = new CheckboxMenuItem(str1[i]);
figItem[0].setShortcut(new MenuShortcut(KeyEvent.VK_L, false));
figItem[1].setShortcut(new MenuShortcut(KeyEvent.VK_R, false));
figItem[2].setShortcut(new MenuShortcut(KeyEvent.VK_O, false));
String[] str2 = {"黒","青","シアン",
"ダークグレイ","グレイ",
"緑","ライトグレイ",
"マゼンダ","オレンジ",
"ピンク","赤","白","黄色"};
for(i = 0; i < colItem.length; i++)
colItem[i] = new CheckboxMenuItem(str2[i]);
for(i = 0; i < figItem.length; i++){figure.add(figItem[i]);}
for(i = 0; i < colItem.length; i++){color.add(colItem[i]);}
file.add(open);
file.add(save);
file.addSeparator();
file.add(quit);
edit.add(undo);
edit.addSeparator();
edit.add(figure);
edit.add(color);
edit.add(clear);
mb.add(file);
mb.add(edit);
mb.add(help);
mb.setHelpMenu(help);
setMenuBar(mb);
for(i = 0; i < figItem.length; i++){figItem[i].addItemListener(this);}
for(i = 0; i < colItem.length; i++){colItem[i].addItemListener(this);}
open.addActionListener(this);
save.addActionListener(this);
quit.addActionListener(this);
clear.addActionListener(this);
undo.addActionListener(this);
addWindowListener(this);
addMouseListener(this);
figItem[0].setState(true);
colItem[0].setState(true);
}
public void paint(Graphics 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(), col));
}else if(figureFlag == 1){
v1.addElement(new RectData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 2){
v1.addElement(new OvalData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 3){
v1.addElement(new FillRectData(x, y, e.getX(), e.getY(), col));
}else if(figureFlag == 4){
v1.addElement(new FillOvalData(x, y, e.getX(), e.getY(), col));
}
repaint();
}
public void actionPerformed(ActionEvent ae){
if(ae.getSource() == save){
try{
FileOutputStream fos = new FileOutputStream(sd.save());
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(v1);
oos.close();
fos.close();
}catch(IOException ioe){
System.out.println(ioe);
}
}
if(ae.getSource() == open){
try{
FileInputStream fis = new FileInputStream(od.open());
ObjectInputStream ois = new ObjectInputStream(fis);
v1.removeAllElements();
v1 = (Vector)ois.readObject();
ois.close();
fis.close();
repaint();
}catch(Exception e){
System.out.println(e);
}
}
if(ae.getSource() == quit){
System.exit(0);
}
if(ae.getSource() == undo && v1.size() > 0){
v1.remove(v1.size()-1);
repaint();
}
if(ae.getSource() == clear){
v1.removeAllElements();
repaint();
}
}
public void itemStateChanged(ItemEvent ie){
if(ie.getSource() == figItem[0]){
figureFlag = 0;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[0].setState(true);
}else if(ie.getSource() == figItem[1]){
figureFlag = 1;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[1].setState(true);
}else if(ie.getSource() == figItem[2]){
figureFlag = 2;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[2].setState(true);
}else if(ie.getSource() == figItem[3]){
figureFlag = 3;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[3].setState(true);
}else if(ie.getSource() == figItem[4]){
figureFlag = 4;
for(int i = 0; i < figItem.length; i++){figItem[i].setState(false);}
figItem[4].setState(true);
}
if(ie.getSource() == colItem[0]){
col = Color.black;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[0].setState(true);
}else if(ie.getSource() == colItem[1]){
col = Color.blue;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[1].setState(true);
}else if(ie.getSource() == colItem[2]){
col = Color.cyan;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[2].setState(true);
}else if(ie.getSource() == colItem[3]){
col = Color.darkGray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[3].setState(true);
}else if(ie.getSource() == colItem[4]){
col= Color.gray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[4].setState(true);
}else if(ie.getSource() == colItem[5]){
col = Color.green;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[5].setState(true);
}else if(ie.getSource() == colItem[6]){
col = Color.lightGray;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[6].setState(true);
}else if(ie.getSource() == colItem[7]){
col = Color.magenta;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[7].setState(true);
}else if(ie.getSource() == colItem[8]){
col = Color.orange;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[8].setState(true);
}else if(ie.getSource() == colItem[9]){
col = Color.pink;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[9].setState(true);
}else if(ie.getSource() == colItem[10]){
col = Color.red;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[10].setState(true);
}else if(ie.getSource() == colItem[11]){
col = Color.white;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[11].setState(true);
}else if(ie.getSource() == colItem[12]){
col = Color.yellow;
for(int i = 0; i < colItem.length; i++){colItem[i].setState(false);}
colItem[12].setState(true);
}
}
public void windowClosing(WindowEvent we){
System.exit(0);
}
public void mouseEntered(MouseEvent me){}
public void mouseExited(MouseEvent me){}
public void mouseClicked(MouseEvent me){}
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){}
}
abstract class Figure implements Serializable{
protected int sx;
protected int sy;
protected int ex;
protected int ey;
protected Color col;
public Figure(int x1, int y1, int x2, int y2, Color c){
sx = x1;
sy = y1;
ex = x2;
ey = y2;
col = c;
}
abstract void Draw(Graphics g);
}
class LineData extends Figure{
public LineData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.drawLine(sx, sy, ex, ey);
}
}
class RectData extends Figure{
public RectData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
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, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.drawOval(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
class FillRectData extends Figure{
public FillRectData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.fillRect(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
class FillOvalData extends Figure{
public FillOvalData(int x1, int y1, int x2, int y2, Color c){
super(x1, y1, x2, y2, c);
}
public void Draw(Graphics g){
g.setColor(col);
g.fillOval(sx<ex?sx:ex, sy<ey?sy:ey,
Math.abs(sx-ex), Math.abs(sy-ey));
}
}
class OpenDialog{
public String open(){
FileDialog fd = new FileDialog(new Frame(),
"ファイルを開く", FileDialog.LOAD);
fd.show();
String fullpath = fd.getDirectory() + fd.getFile();
return fullpath;
}
}
class SaveDialog{
public String save(){
FileDialog fd = new FileDialog(new Frame(),
"ファイルの保存", FileDialog.SAVE);
fd.show();
String fullpath = fd.getDirectory() + fd.getFile();
return fullpath;
}
}
ま、とりあえず完成。

