- ベストアンサー
Graphicsクラスを使って描画履歴を残して、しかも色も選択しながら描画を行いたい
- 描画色を変更して再描画すると前の描画履歴が消えてしまう問題についての解決方法を教えてください。
- グローバルなカラーオブジェクトとマウスイベントを使用して、描画色を変更する方法を紹介します。
- マウスドラッグによる座標取得と、二つの色を使い分けて描画する方法を説明します。
- みんなの回答 (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/events/example-1dot4/index.html#MouseEventDemo で、今回の描画のプログラムはこんな感じのことでしょうか??まだ、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); } }
その他の回答 (2)
- omni2
- ベストアンサー率53% (33/62)
(2)Graphics.setColor()は現在の描画色を変更するだけだとおもいます。現在の描画色はGraphics.getColor()で取得できます。 (1)Component.setForeground()はコンポーネントのフォアグラウンドカラーを設定するときに使うんだとおもいます。label1.setForeground(Color.red)だと、 ラベル1のフォアグラウンドカラーが赤に設定されて赤で塗られます。label1.setForeground(Color.pink)などにしてみて、どこの色が設定されているか確認されてみてはいかがでしょうか? その他の違いについては私もよくわかってなかったりします・・
お礼
こんばんは。 いろいろと説明ありがとうございます。 とても有益でした。 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
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
このプログラムでいう描画履歴とはなんですか?
補足
パネルなどに緑の線を描き、その直後に赤に変えて再度線を描くと 緑の線は消えてしまう状態のことです。 説明がうまくできなくてご迷惑をおかけしましたm(_ _)m
お礼
こんにちは。 サンプルプログラムありがとうございます。 とても役に立ち、またそのロジックを理解するうえでとても役に立ちました。 このサンプルをコンパイルして確認したところ、希望した通りにできていました。 updateメソッドをオーバーライドして画面クリアを回避するところなど、paintメソッドを利用する上でとてもいい教材となりました。 それで、私のプログラムの一番の誤りは (1)Component.setForeground() と (2)Graphics.setColor() の動作の違いを理解していないところにありました。 (1)の場合は今までの描画がクリアされ、 (2)の場合は描画色のみが変更され描画がクリアされることはありませんでした。 で、結果として(2)のメソッドを利用することにより自分の希望する動作を実現することができました。 (1)と(2)が同時に利用されれば(2)の設定色が優先されるのですよね。 その他、(1)と(2)の違いなど注意する点ありましたら教えていただきたく思います。 あと無名内部クラスについてですが、無名内部クラスから外部のクラス(無名内部クラスを含むクラス)のデータやコードへアクセスする場合は、クラス間を意識せずアクセスできると一応理解しました。 もう少し理解が進めばそのロジックもわかると思うのですが...