おえかき その9 描画色選択Advertisement描画色を選択できるようにしよー
とりあえず、Color(リンク先:java.sun.com)クラスの定数を使えればいいや。定数ってのはblackとかblueとかのあれね。
あー、どーしよ。
変更点がいがいとあるかも。大変だ。いちいち下のようにしてるとめんどくさいので、
CheckboxMenuItem black, blue, (略)
black = new CheckboxMenuItem("黒");
blue = new CheckboxMenuItem("青");
(略)
black.addItemListener(this);
blue.addItemListener(this);
(略)
とかダラダラ書かなきゃいけないのと、さらにめんどくさいのはチェックマークのオン、オフ切り替えだ。
black.setState(false); blue.setState(false); red.setState(false); pink.setState(false); white.setState(false); orange.setState(true); (略)こんな感じのコードを何箇所も書くのはメンドイ&読みにくい、と。 グループ化もできない感じだしなぁ。てことで、配列にしちゃお。
Menu color;
CheckboxMenuItem[] colItem = new CheckboxMenuItem[13];
String[] str = {"黒","青","シアン","ダークグレイ","グレイ",
"緑","ライトグレイ","マゼンダ",
"オレンジ","ピンク","赤","白","黄色"};
//オブジェクト生成
for(i = 0; i < str.length; i++){colItem[i] = new CheckboxMenuItem(str[i]);}
//メニューに追加
for(i = 0; i < colItem.length; i++){color.add(colItem[i]);}
//リスナ登録
for(i = 0; i < colItem.length; i++){colItem[i].addItemListener(this);}
オン、オフの切り替えは
//全部オフしたあとに、 for(i = 0; i < colItem.length; i++){colItem[i].setState(false);} //必要なモノだけオン colItem[3].setState(true);んー、いいのか、これで。ま、もっといいのも考えとく。 つくるゾ
何やるか。
すべての図形オブジェクトの親クラスFigureにColor型変数を追加して、コンストラクタ変更。 図形オブジェクト生成の時の引数変更。 あとは追加分の処理。 よし。
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 line, rect, oval;
//13個のCheckboxMenuItemを格納する配列
CheckboxMenuItem[] c = 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("画面消去");
line = new CheckboxMenuItem("直線");
rect = new CheckboxMenuItem("四角形");
oval = new CheckboxMenuItem("楕円");
//オブジェクト生成
String[] str = {"黒","青","シアン",
"ダークグレイ","グレイ",
"緑","ライトグレイ",
"マゼンダ","オレンジ",
"ピンク","赤","白","黄色",};
for(i = 0; i < str.length; i++)
colItem[i] = new CheckboxMenuItem(str[i]);
line.setShortcut(new MenuShortcut(KeyEvent.VK_L, false));
rect.setShortcut(new MenuShortcut(KeyEvent.VK_R));
oval.setShortcut(new MenuShortcut(KeyEvent.VK_O, false));
figure.add(line);
figure.add(rect);
figure.add(oval);
//colorメニューに追加。
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 < colItem.length; i++){colItem[i].addItemListener(this);}
line.addItemListener(this);
rect.addItemListener(this);
oval.addItemListener(this);
quit.addActionListener(this);
clear.addActionListener(this);
undo.addActionListener(this);
addWindowListener(this);
addMouseListener(this);
line.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));
}
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() == line){
figureFlag = 0;
line.setState(true);
rect.setState(false);
oval.setState(false);
}else if(e.getSource() == rect){
figureFlag = 1;
line.setState(false);
rect.setState(true);
oval.setState(false);
}else if(e.getSource() == oval){
figureFlag = 2;
line.setState(false);
rect.setState(false);
oval.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));
}
}
もームチャクチャだ。なんか考えなきゃ。実行結果。 ![]() まぁ、やりたいことはできてるな。 Advertisement |
ショートカット・634トップページ・このカテゴリのトップページに戻る ・634ラボ UIコレクションギャラリー サイト検索Y!ログール |