アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなドロープログラムを作ってみたのですが
描画色を変更して再描画すると前の描画履歴が消えてしまいます
描画色を変更しても以前の描画履歴の消えないようにするには
どのようにすればいいのでしょうか。

文字数制限によりプログラムをアップできませんでしたので一部を記述させていただきます。

グローバルなカラーオブジェクトを用意し
class Globe{
static mycol=Color.white;
}

二つのラベルを用意して
Label red=new Label("■");
Label green=new Label("■");
ラベルそれぞれにマウスリスナーを登録して
red.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
GLobe.mycol=Color.red;
}
});
green.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
GLobe.mycol=Color.green;
}
});
マウスドラッグによる座標取得を行い
public void mouseDragged(MouseEvent e){
x=e.getX();
y=e.getY();
repaint();
}
二つの色を使い分けて描画できるようにしました。
public void update(Graphics g){
setForeground(Globe.mycol);
g.fillOval(x-3,y-3,6,6);
}

A 回答 (3件)

おはようございます。



昨日の質問で書き込もうかと思っていたら、締め切っていらっしゃったので、書き込みます。
私も本の丸写しでほとんど意味がわかっておりませんが、↓のやり方でもできるんですが、MouseAdapterはAbstractクラスなのに(たぶん)なぜnewできるのかさっぱりわかりません。私も質問してみようかとおもってます。

red.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
GLobe.mycol=Color.red;
}
それで、サンマイクロシステムズのサイトのサンプルをみてると、MouseMotionListenerをインプリメントしてるので、そちらのやり方のほうが一般的なのかもしれません??
http://java.sun.com/docs/books/tutorial/uiswing/ …

で、今回の描画のプログラムはこんな感じのことでしょうか??まだ、Javaプログラム、オブジェクト指向さえよくわかってないので、こういう書き方ではまずいと思いますので、変更してみてください。
また、ウインドウが隠れたりすると消えてしまいますので、その辺もなおしてみてください。
まちがってるところもあるかもしれません。

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class test5 extends Frame implements MouseListener,MouseMotionListener{
Label red, green, blue;
Label label1,label2;
Point pt = new Point(0,0);
Color Mycolor = Color.white;
int label1_id,label2_id;

test5(){

setSize(300,300);
setLocation(100,100);
setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
label1 = new Label("■");
label1_id = label1.hashCode();
add(label1);
label1.setForeground(Color.red);
label1.setBackground(Color.red);

label2 = new Label("■");
label2_id = label2.hashCode();

add(label2);
label2.setForeground(Color.blue);
label2.setBackground(Color.blue);

label2.addMouseListener(this);
label1.addMouseListener(this);
addMouseMotionListener(this);

}
public static void main(String args[]){
test5 t5 = new test5();
t5.show();
}


public void mouseDragged(MouseEvent e){
System.out.println(e.getSource().toString());
pt.x = e.getX();
pt.y = e.getY();
repaint();

}
public void mouseMoved(MouseEvent e){}

public void mousePressed(MouseEvent e){}

public void mouseReleased(MouseEvent e){}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){
System.out.println(e.getSource().toString());
if(label1_id == e.getSource().hashCode()){Mycolor = Color.red;}
else if(label2_id == e.getSource().hashCode()){Mycolor = Color.blue;}
}

public void update(Graphics g){
paint(g);
}

public void paint(Graphics g){
g.setColor(Mycolor);
g.fillOval(pt.x,pt.y,10,10);

}
}
    • good
    • 0
この回答へのお礼

こんにちは。
サンプルプログラムありがとうございます。
とても役に立ち、またそのロジックを理解するうえでとても役に立ちました。
このサンプルをコンパイルして確認したところ、希望した通りにできていました。

updateメソッドをオーバーライドして画面クリアを回避するところなど、paintメソッドを利用する上でとてもいい教材となりました。

それで、私のプログラムの一番の誤りは
(1)Component.setForeground() と (2)Graphics.setColor()
の動作の違いを理解していないところにありました。

(1)の場合は今までの描画がクリアされ、
(2)の場合は描画色のみが変更され描画がクリアされることはありませんでした。
で、結果として(2)のメソッドを利用することにより自分の希望する動作を実現することができました。

(1)と(2)が同時に利用されれば(2)の設定色が優先されるのですよね。
その他、(1)と(2)の違いなど注意する点ありましたら教えていただきたく思います。

あと無名内部クラスについてですが、無名内部クラスから外部のクラス(無名内部クラスを含むクラス)のデータやコードへアクセスする場合は、クラス間を意識せずアクセスできると一応理解しました。
もう少し理解が進めばそのロジックもわかると思うのですが...

お礼日時:2005/08/21 22:29

(2)Graphics.setColor()は現在の描画色を変更するだけだとおもいます。

現在の描画色はGraphics.getColor()で取得できます。

(1)Component.setForeground()はコンポーネントのフォアグラウンドカラーを設定するときに使うんだとおもいます。label1.setForeground(Color.red)だと、
ラベル1のフォアグラウンドカラーが赤に設定されて赤で塗られます。label1.setForeground(Color.pink)などにしてみて、どこの色が設定されているか確認されてみてはいかがでしょうか?

その他の違いについては私もよくわかってなかったりします・・
    • good
    • 0
この回答へのお礼

こんばんは。
いろいろと説明ありがとうございます。
とても有益でした。
setColorとserForegroundについていろいろ動作確認して動きを確認してみました。

あと、アダプタークラスについてですが、
アダプタークラスはインターフェイスに定義されているすべてのメソッドが
コードの無い空のメソッドとして実装済みですので
例えば MouseAdapter の場合、その内部を見てみると

public class MouseAdapter implements MouseListener{
public void mouseClicked(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}

となっていて、イベントに対する動作は記入しておらず、
実際に私たちがアダプタークラスを使う場合にはアダプタークラスを拡張(extends)し,使いたいイベントメソッドだけをオーバーライドしてするということだと思います。

もし間違っていればどなたか細くお願いしますm(_ _)m

お礼日時:2005/08/23 20:05

このプログラムでいう描画履歴とはなんですか?

この回答への補足

パネルなどに緑の線を描き、その直後に赤に変えて再度線を描くと
緑の線は消えてしまう状態のことです。
説明がうまくできなくてご迷惑をおかけしましたm(_ _)m

補足日時:2005/08/21 23:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!