
以下のようなドロープログラムを作ってみたのですが
描画色を変更して再描画すると前の描画履歴が消えてしまいます
描画色を変更しても以前の描画履歴の消えないようにするには
どのようにすればいいのでしょうか。
文字数制限によりプログラムをアップできませんでしたので一部を記述させていただきます。
グローバルなカラーオブジェクトを用意し
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);
}

No.2ベストアンサー
- 回答日時:
おはようございます。
昨日の質問で書き込もうかと思っていたら、締め切っていらっしゃったので、書き込みます。
私も本の丸写しでほとんど意味がわかっておりませんが、↓のやり方でもできるんですが、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);
}
}
こんにちは。
サンプルプログラムありがとうございます。
とても役に立ち、またそのロジックを理解するうえでとても役に立ちました。
このサンプルをコンパイルして確認したところ、希望した通りにできていました。
updateメソッドをオーバーライドして画面クリアを回避するところなど、paintメソッドを利用する上でとてもいい教材となりました。
それで、私のプログラムの一番の誤りは
(1)Component.setForeground() と (2)Graphics.setColor()
の動作の違いを理解していないところにありました。
(1)の場合は今までの描画がクリアされ、
(2)の場合は描画色のみが変更され描画がクリアされることはありませんでした。
で、結果として(2)のメソッドを利用することにより自分の希望する動作を実現することができました。
(1)と(2)が同時に利用されれば(2)の設定色が優先されるのですよね。
その他、(1)と(2)の違いなど注意する点ありましたら教えていただきたく思います。
あと無名内部クラスについてですが、無名内部クラスから外部のクラス(無名内部クラスを含むクラス)のデータやコードへアクセスする場合は、クラス間を意識せずアクセスできると一応理解しました。
もう少し理解が進めばそのロジックもわかると思うのですが...

No.3
- 回答日時:
(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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- 美術・アート クリップスタジオペイントについて。 1 2022/11/08 15:14
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java eclipse実行ができない 2 2022/07/27 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Swingで印刷
-
SortedSetならぬSortedListの良...
-
「Util.Timer」を使って車輪が...
-
落下する正方形を左右に移動す...
-
Java 他クラスの呼び出しが上手...
-
struts2のchainで値の受け渡し...
-
決められて時間が経過するとア...
-
長方形を描いて、それを移動さ...
-
JavaFXでの表内のチェックボッ...
-
C# visibleプロパティをfalseに...
-
C#でキーイベントが発生しない...
-
C#でのWNetAddConnection3の使...
-
setIcon() の反対のようなもの...
-
エンターキーを押すとOKボタン...
-
リストボックスの選択項目をさ...
-
Thread.sleepのInterruptedExce...
-
Graphicsクラスを使って描画履...
-
swing初心者です
-
JPanel上のマウスの座標の取得
-
JScrollPaneで、表示がおかしく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C# visibleプロパティをfalseに...
-
C#でのWNetAddConnection3の使...
-
C# DataGridView列カスタマイズ
-
C# MouseHoverを何度も呼ぶには
-
C#でキーイベントが発生しない...
-
Junitテストでvoid戻り値メッソ...
-
C# WinForm のDataGridView Cel...
-
ボタンの複数割り当てについて
-
ユーザーコントロールを動的に...
-
ボタンのイベントで異なるウィ...
-
LVM_SETITEMSTATEでListViewの...
-
c# スレッド間でのデータの共有
-
C#,listBoxのItem追加について...
-
unityでのC++エラーの原因がわ...
-
C# 矢印キーの取得
-
JavaFXでの表内のチェックボッ...
-
C# 半角カナの文字化けについて
-
C#で別のFormへ複数の値を返そ...
おすすめ情報