🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2320閲覧

絵描きプログラムのボタンクリックで色変更と一括削除ができるようにしたいのですが上手くいきません

Shooo-8897

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2021/01/23 12:42

編集2021/01/24 08:58

前提・実現したいこと

お絵描きプログラムで色変更と一括削除をできるようにしたいです。

該当のソースコード

ファイル1

java

1package freetask2; 2 3import java.awt.*; 4import java.awt.event.*; 5 6public class Draw extends Frame{ 7 int x,y,cx,cy; 8 /*public static void main(String[] args){ 9 Draw ft = new Draw(); 10 }*/ 11 Color cuurentColor = Color.black; 12 13 public Draw(){ 14 super("ペイント"); 15 addWindowListener(new SampleWindowListener()); 16 addMouseListener(new SampleMouseAdapter()); 17 addMouseMotionListener(new SampleMouseAdapter()); 18 //setSize(500,500); 19 //setVisible(true); 20 } 21 22 public void setColor(Color newColor){ 23 currrentColor = new Color; 24 } 25 26 class SampleWindowListener extends WindowAdapter{ 27 public void windowClosing(WindowEvent e){ 28 System.exit(0); 29 } 30 } 31 32 class SampleMouseAdapter extends MouseAdapter{ 33 public void mousePressed(MouseEvent e){ 34 x = e.getX(); 35 y = e.getY(); 36 } 37 public void mouseDragged(MouseEvent e){ 38 Graphics g = getGraphics(); 39 cx = e.getX(); 40 cy = e.getY(); 41 g.setColor(currentColor); 42 g.drawLine(x,y,cx,cy); 43 x = cx; 44 y = cy; 45 } 46 } 47} 48

ファイル2

java

1package freetask2; 2 3import java.awt.*; 4import java.awt.event.*; 5 6public class Draw2 extends Draw{ 7 private Button Whitebt,Blackbt,Redbt,Bluebt,Greenbt,Clearbt; 8 Draw drawarea; 9 public static void main(String[] args){ 10 Draw2 ft = new Draw2(); 11 } 12 13 Draw2(){ 14 setSize(500,500); 15 16 drawarea = new Draw(); 17 18 Whitebt = new Button("White"); 19 add(Whitebt); 20 Whitebt.addActionListener(new SampleActionListener()); 21 Blackbt = new Button("Black"); 22 add(Blackbt); 23 Blackbt.addActionListener(new SampleActionListener()); 24 Redbt = new Button("Red"); 25 add(Redbt); 26 Redbt.addActionListener(new SampleActionListener()); 27 Bluebt = new Button("Blue"); 28 add(Bluebt); 29 Bluebt.addActionListener(new SampleActionListener()); 30 Greenbt = new Button("Green"); 31 add(Greenbt); 32 Greenbt.addActionListener(new SampleActionListener()); 33 Clearbt = new Button("Clear"); 34 add(Clearbt); 35 Clearbt.addActionListener(new SampleActionListener()); 36 37 Panel pan = new Panel(); 38 pan.setLayout(new GridLayout(1,6)); 39 pan.add(Whitebt); 40 pan.add(Blackbt); 41 pan.add(Redbt); 42 pan.add(Bluebt); 43 pan.add(Greenbt); 44 pan.add(Clearbt); 45 46 add("North",pan); 47 setVisible(true); 48 } 49 50 class SampleActionListener implements ActionListener{ 51 public void actionPerformed(ActionEvent e){ 52 if(e.getSource()==Whitebt){ 53 drawarea.setColor(Color.white); 54 }else if(e.getSource()==Blackbt){ 55 drawarea.setColor(Color.black); 56 }else if(e.getSource()==Redbt){ 57 drawarea.setColor(Color.red); 58 }else if(e.getSource()==Bluebt){ 59 drawarea.setColor(Color.blue); 60 }else if(e.getSource()==Greenbt){ 61 drawarea.setColor(Color.green); 62 }else if(e.getSource()==Clearbt){ 63 Graphics g = getGraphics(); 64 drawarea.setColor(Color.white); 65 g.fillRect(0,0,getSize().width,getSize().height); 66 drawarea.setColor(Color.black); 67 repaint(); 68 } 69 } 70 } 71}

試したこと

実行して絵を描くことはできるのですが色変更と一括削除ができません。一括削除(Clear)に関してはボタンクリックでで削除されるのですがrepaint()に反応しているだけのように思えます。特にエラーも出ていないためどこが間違っているのかもわかりません。どこをどう直せばよいかを教えていただけると助かります。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

VSCode

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

直接的な原因はgetGraphics()したものは、Foregroundの色が設定されます。
そのためsetColor()したとしてもgetGraphics()するたびに、黒に戻ってしまいます。
方針としてはColorをメンバ変数にもち、g.drawLine()の前でsetColor()することです。

しかし現在の実装ですと再描画される(ウィンドウサイズを変更する等)と、すべて消えてしまうのでよろしくありません。
通常はBufferedImageに描き、消えないように保持しておきます。

AWTよりSwingのほうがよいと思いますので、「java swing お絵かき」等で検索してみてください。


追記
上記内容を分かったうえで、とりあえず動かすだけでよいならこんな感じ?

Java

1import java.awt.Button; 2import java.awt.Color; 3import java.awt.Frame; 4import java.awt.Graphics; 5import java.awt.GridLayout; 6import java.awt.Panel; 7import java.awt.event.ActionEvent; 8import java.awt.event.ActionListener; 9import java.awt.event.MouseAdapter; 10import java.awt.event.MouseEvent; 11import java.awt.event.WindowAdapter; 12import java.awt.event.WindowEvent; 13 14 15class Draw extends Frame { 16 int x, y, cx, cy; 17 Color currentColor = Color.black; 18 19 public Draw() { 20 super("ペイント"); 21 addWindowListener(new SampleWindowListener()); 22 addMouseListener(new SampleMouseAdapter()); 23 addMouseMotionListener(new SampleMouseAdapter()); 24 } 25 26 public void setColor(Color newColor) { 27 currentColor = newColor; 28 } 29 30 class SampleWindowListener extends WindowAdapter { 31 public void windowClosing(WindowEvent e) { 32 System.exit(0); 33 } 34 } 35 36 class SampleMouseAdapter extends MouseAdapter { 37 public void mousePressed(MouseEvent e) { 38 x = e.getX(); 39 y = e.getY(); 40 } 41 42 public void mouseDragged(MouseEvent e) { 43 Graphics g = getGraphics(); 44 cx = e.getX(); 45 cy = e.getY(); 46 g.setColor(currentColor); 47 g.drawLine(x, y, cx, cy); 48 x = cx; 49 y = cy; 50 } 51 } 52} 53 54 55class Draw2 extends Draw { 56 private Button Whitebt, Blackbt, Redbt, Bluebt, Greenbt, Clearbt; 57// Draw drawarea; // Drawを継承しているのだから自分自身 58 59 public static void main(String[] args) { 60 Draw2 ft = new Draw2(); 61 } 62 63 Draw2() { 64 setSize(500, 500); 65 66// drawarea = new Draw(); 67 68 Whitebt = new Button("White"); 69// add(Whitebt); // pan.add(Whitebt); しているので2重登録 70 Whitebt.addActionListener(new SampleActionListener()); 71 Blackbt = new Button("Black"); 72 Blackbt.addActionListener(new SampleActionListener()); 73 Redbt = new Button("Red"); 74 Redbt.addActionListener(new SampleActionListener()); 75 Bluebt = new Button("Blue"); 76 Bluebt.addActionListener(new SampleActionListener()); 77 Greenbt = new Button("Green"); 78 Greenbt.addActionListener(new SampleActionListener()); 79 Clearbt = new Button("Clear"); 80 Clearbt.addActionListener(new SampleActionListener()); 81 82 Panel pan = new Panel(); 83 pan.setLayout(new GridLayout(1, 6)); 84 pan.add(Whitebt); 85 pan.add(Blackbt); 86 pan.add(Redbt); 87 pan.add(Bluebt); 88 pan.add(Greenbt); 89 pan.add(Clearbt); 90 91 add("North", pan); 92 setVisible(true); 93 } 94 95 class SampleActionListener implements ActionListener { 96 public void actionPerformed(ActionEvent e) { 97 if (e.getSource() == Whitebt) { 98 setColor(Color.white); 99 } else if (e.getSource() == Blackbt) { 100 setColor(Color.black); 101 } else if (e.getSource() == Redbt) { 102 setColor(Color.red); 103 } else if (e.getSource() == Bluebt) { 104 setColor(Color.blue); 105 } else if (e.getSource() == Greenbt) { 106 setColor(Color.green); 107 } else if (e.getSource() == Clearbt) { 108 Graphics g = getGraphics(); 109 setColor(Color.white); 110 g.fillRect(0, 0, getSize().width, getSize().height); 111 setColor(Color.black); 112 repaint(); 113 } 114 } 115 } 116}

投稿2021/01/23 14:37

編集2023/08/13 12:06
TN8001

総合スコア9862

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shooo-8897

2021/01/24 09:10

回答ありがとうございます。 少し改良してみたのですがやはりうまくいきません。 いろいろと調べているのですが学習不足で申し訳ないです。 最低限色変更はできるようにしたいのですが参考のプログラムと追加位置を教えていただけないでしょうか。 お手数ですがご回答お待ちしております。
TN8001

2021/01/24 09:35

とりあえず動くコードを追記しました。
Shooo-8897

2021/01/24 09:54

動きました!ありがとうございます。 三か所のコメントアウトと条件処理のdrawarea.を変更して下さったと思うのですが、原因はどこだったのでしょうか。
TN8001

2021/01/24 10:21

編集後のコードはコンパイルエラーなんですが、編集ミスとしますね^^; drawarea.setColor(Color.white); これが原因です。 Draw2 ft = new Draw2(); は、Frameを継承しているDrawを継承しているDraw2を作成しています。 drawarea = new Draw(); は、Frameを継承しているDrawを作成しています。 つまりFrame(ウィンドウ)を2つ作っています。 ftは、setVisible(true); されているので見えているウィンドウです。 drawareaは、見えていないがftとは全く別のウィンドウです。 別のもののsetColor()をしても、見えているウィンドウの色は変わりません。 これでご理解いただけますでしょうか? 個人的にはDraw・Draw2と、2つに分けるほどではない気がします。 分けなければこのような混乱はなかったでしょう。
Shooo-8897

2021/01/24 14:24

理解できました!課題でクラスを二つ以上という条件があったため分けるようにしてみました。 丁寧な解説、とても助かりました。三日間くらい試行錯誤してもできなかったので嬉しいです。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問