質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

1回答

3191閲覧

ペイントツール 色の選択とボタンを押して線を消したい

Kazumannbo-

総合スコア5

Java

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

0グッド

0クリップ

投稿2020/03/28 06:41

編集2020/03/28 07:25

前提・実現したいこと

簡単なペイントツールを解説サイトを見ながら作成していて
見つけた仕組みを組み合わせて
ボタンを押して線の色を変更したいのと
クリアのボタンを押してウィンドウの線を消したいのですが
何を見て解決したらよいのかわからず困っています。

ここを見ながら作っています
http://www.ibe.kagoshima-u.ac.jp/edu/ProgramingJava/StreamIO/s5.html

理解が及んでいないことは重々承知しているのですが
知恵をお貸しください

よろしくお願い致します。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Java

1import java.awt.Button; 2import java.awt.Color; 3import java.awt.Event; 4import java.awt.Graphics; 5import java.awt.Point; 6import java.awt.event.MouseEvent; 7import java.awt.event.MouseListener; 8import java.awt.event.MouseMotionListener; 9import java.util.ArrayList; 10import java.util.Enumeration; 11import java.util.List; 12import java.util.Vector; 13 14import javax.swing.JFrame; 15import javax.swing.JPanel; 16 17public class simplePainter { 18 static Vector data; 19 20 public static void main(String[] args) { 21 JFrame frame = new JFrame("SimplePainter"); 22 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 frame.setSize(1000, 1000); 24 frame.setLocationRelativeTo(null); 25 26 Canvas canvas = new Canvas(); 27 frame.add(canvas); 28 29 frame.setVisible(true); 30 31 data = new Vector(); 32 33 34 } 35 36 public void draw(Graphics g) { 37 38 39 } 40 41} 42 43class Canvas extends JPanel implements MouseListener, MouseMotionListener { 44 45 List<List<Point>> pintsList = new ArrayList<>(); 46 47 List<Point> currentPoint = new ArrayList<>(); 48 49 boolean isDraw = false; 50 51 private Object data; 52 public Canvas() { 53 addMouseListener(this); 54 addMouseMotionListener(this); 55 setSize(1000,1000); 56 add(new Button("Quit")); 57 add(new Button("Clear")); 58 59 currentPoint = new Vector(); 60 61 } 62 63 void quit(){ 64 System.exit(0); 65 } 66 67 @Override 68 public void paint(Graphics g) { 69 super.paint(g); 70 paintFreeCurvedLines(g); 71 72 73 74 Color c = new Color(100,255,100); 75 g.setColor(c); 76 } 77 78 79 80 81 void paintFreeCurvedLines(Graphics g) { 82 if (isDraw) { 83 pintsList.add(currentPoint); 84 for (List<Point> points : pintsList) { 85 for (int i = 1; i < points.size(); i++) { 86 Point start = points.get(i-1); 87 Point end = points.get(i); 88 g.drawLine(start.x, start.y, end.x, end.y); 89 Color c = new Color(100,255,100); 90 g.setColor(c); 91 92 } 93 } 94 95 } 96 currentPoint = new ArrayList<>(); 97 98 99 } 100 101 @Override 102 public void mouseClicked(MouseEvent e) { 103 104 } 105 106 @Override 107 public void mousePressed(MouseEvent e) { 108 isDraw = false; 109 currentPoint.add(new Point(e.getX(),e.getY())); 110 111 } 112 113 @Override 114 public void mouseReleased(MouseEvent e) { 115 isDraw =true; 116 currentPoint.add(new Point(e.getX(), e.getY())); 117 super.repaint(); 118 119 120 } 121 122 @Override 123 public void mouseEntered(MouseEvent e) { 124 125 126 } 127 128 @Override 129 public void mouseExited(MouseEvent e) { 130 131 } 132 133 @Override 134 public void mouseDragged(MouseEvent e) { 135 currentPoint.add(new Point(e.getX(),e.getY())); 136 137 138 } 139 140 @Override 141 public void mouseMoved(MouseEvent e) { 142 143 } 144 145 public void clear() { 146 data.removeAllElement(); 147 repaint(); 148 149 150 } 151 152 public void paint1(Graphics g){ 153 for(Enumeration e=data.elements();e.hasMoreElements();) 154 ((simplePainter)e.nextElement()).draw(g); 155 } 156 157 public boolean action(Event ev,Object arg){ 158 if(ev.target instanceof Button){ 159 if(arg.equals("Quit")) 160 quit(); 161 if(arg.equals("Clear")) 162 clear(); 163 } 164 return true; 165 } 166 167 @SuppressWarnings("deprecation") 168 public boolean handleEvent(Event ev){ 169 if(ev.id == Event.WINDOW_DESTROY) 170 quit(); 171 return super.handleEvent(ev); 172 } 173 174} 175 176 177 178 179

試したこと

カラーパレットを一度組み込もうとしたが適応方法がわからず
上手く色が実装できないため現在はコードを消しています

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

Eclipse を使っています。

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

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

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

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

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

m.ts10806

2020/03/28 06:47

>Vector を使うとクリアが実装できるとあったが どこでしょうか。出典明示してください。
m.ts10806

2020/03/28 07:17

質問は編集できるので情報は基本的に質問本文に記載してください
guest

回答1

0

ベストアンサー

Vector は, 言ってしまえば List の古い版です.
今わざわざ Vector を( List を使っているコードと混ぜて) 使う意味は無いのではと思います.

「何を見て解決」というなら, 参考にされている記事・コードしかありません.
要は, 線をどうデータとして表現しているか, その表現の中で"消す"というのはどういうことかを理解しているかどうかです.
複数のプラモデルを組み合わせて新しいものを作ろうとするなら, 元のプラモデルの構造を理解している必要があるはずです.
(「理解が及んでいないことは重々承知している」なればこそ)参考にされている記事・コードの理解を進めることをお勧めします.

#追加
リンク先の SimpleDraw02 を Swing 化するとこのような感じでしょうか.
なるべく元の状態を維持しつつ…と思ったのですが, 描画領域は専用クラス(CanvasPanel)にしないと面倒そうでしたので諦め, 各リスナも無名クラス化してしまいました.

java

1//package teratail.q249928; 2 3import java.awt.*; 4import java.awt.event.*; 5import java.util.ArrayList; 6import java.util.List; 7 8import javax.swing.*; 9 10/** 11 * 線分情報クラス <p> 12 * 描画された1本の線分の情報を記憶しておくためのクラスです。 13 * 線分情報には、始点座標と終点座標とがあります。 14 */ 15class SegmentInfo { 16 17 /** 始点座標 */ 18 private int x1, y1; 19 20 /** 終点座標 */ 21 private int x2, y2; 22 23 /** 色 */ 24 private Color color; 25 26 /** 始点と終点を与えて生成します。 */ 27 SegmentInfo(int x1, int y1, int x2, int y2, Color color) { 28 this.x1 = x1; 29 this.y1 = y1; 30 this.x2 = x2; 31 this.y2 = y2; 32 this.color = color; 33 } 34 35 /** 自分自身を描画します。 */ 36 void draw(Graphics g) { 37 g.setColor(color); 38 g.drawLine(x1, y1, x2, y2); 39 } 40} 41 42class CanvasPanel extends JPanel { 43 /** 線分の描画のための座標. */ 44 private int lx1, ly1, lx2, ly2; 45 46 /** 線分情報を記憶しておくためのベクトル. */ 47 private List<SegmentInfo> data = new ArrayList<SegmentInfo>(); 48 49 private Color color = new Color(100,255,100); 50 51 CanvasPanel() { 52 super(null); 53 setBackground(Color.WHITE); 54 55 addMouseListener(new MouseAdapter() { 56 /** 57 * マウスボタンが押されると、その後のマウスの動きを追跡して仮の線を引く必要があります。 58 */ 59 @Override 60 public void mousePressed(MouseEvent e) { 61 lx1 = lx2 = e.getX(); 62 ly1 = ly2 = e.getY(); 63 drawXORLine(); 64 } 65 66 /** 67 * マウスボタンが離されると、以前の仮の線を消して、確定した直線を描きます。 68 */ 69 @Override 70 public void mouseReleased(MouseEvent e) { 71 drawXORLine(); 72 lx2 = e.getX(); 73 ly2 = e.getY(); 74 data.add(new SegmentInfo(lx1, ly1, lx2, ly2, color)); 75 repaint(); 76 } 77 }); 78 79 addMouseMotionListener(new MouseMotionAdapter() { 80 /** 81 * マウスがドラッグされると、それまでの仮の線を消して、新しい仮の線を描きます。 82 */ 83 @Override 84 public void mouseDragged(MouseEvent e) { 85 drawXORLine(); 86 lx2 = e.getX(); 87 ly2 = e.getY(); 88 drawXORLine(); 89 } 90 }); 91 } 92 93 /** 仮の線分の描画. */ 94 private void drawXORLine() { 95 // XORモードで仮の線分を描画します。 96 // XORモードで描かれた線分は、再度同じ線分を描画すると消えます。 97 Graphics g = getGraphics(); 98 g.setXORMode(getBackground()); 99 g.drawLine(lx1, ly1, lx2, ly2); 100 g.dispose(); 101 } 102 103 /** すべての線分を描画します。 */ 104 @Override 105 public void paintComponent(Graphics g) { 106 super.paintComponent(g); 107 for(SegmentInfo e : data) e.draw(g); 108 } 109 110 /** 全データを消して、再描画します。 */ 111 void clear() { 112 data.clear(); 113 repaint(); 114 } 115} 116 117public class SimpleDraw02 extends JFrame { 118 119 public SimpleDraw02() { 120 super("SimpleDraw ver 0.2(Swing)"); 121 setSize(1000, 1000); 122 setLocationRelativeTo(null); 123 124 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 125 addWindowListener(new WindowAdapter() { 126 @Override 127 public void windowClosing(WindowEvent e) { 128 quit(); 129 } 130 }); 131 132 CanvasPanel canvas = new CanvasPanel(); 133 add(canvas, BorderLayout.CENTER); 134 135 JPanel eastPanel = new JPanel(new FlowLayout()); 136 add(eastPanel, BorderLayout.EAST); 137 138 JButton quitButton = new JButton("Quit"); 139 quitButton.addActionListener(new ActionListener() { 140 /** Quit ボタンが押されたときの処理を行います。 */ 141 @Override 142 public void actionPerformed(ActionEvent e) { 143 quit(); 144 } 145 }); 146 eastPanel.add(quitButton); 147 148 JButton clearButton = new JButton("Clear"); 149 clearButton.addActionListener(new ActionListener() { 150 /** Clear ボタンが押されたときの処理を行います。 */ 151 @Override 152 public void actionPerformed(ActionEvent e) { 153 canvas.clear(); 154 } 155 }); 156 eastPanel.add(clearButton); 157 } 158 159 /** 160 * プログラムを終了します。 161 * 終了にはいくつかの方法がありますが、すべてここでその処理を行うことで、動作の統一を図ります。 162 */ 163 void quit() { 164 System.exit(0); 165 } 166 167 /** 168 * クラスを直接実行すると、このメソッドから開始されます。 169 * ここでは、クラス自身のインスタンスを作ってそれを表示しています。 170 * これにより、クラスの実行が開始されます。 171 */ 172 public static void main(String[] args) { 173 new SimpleDraw02().setVisible(true); 174 } 175}

#追加2
リンク先での「線の色を指定できるように」という課題でのヒントにおきまして「『Javaって何ですか?』の章の例題が参考」とありますが, アプレット(AWT)ですので, アプリケーション(Swing)化しました.
色の設定は Choice(AWT) から JComboBox(Swing) に変わりますが, 扱い方(addItem 等)はあえて変えていません.

java

1//package teratail.q249928; 2 3import java.awt.*; 4import java.awt.event.*; 5 6import javax.swing.*; 7 8// Lineクラス 9class Line { 10 Point sp, ep; // 始点と終点 11 Color color; // 色 12 13 // コンストラクタ 14 Line(Point p1, Point p2, Color c) { 15 sp=p1; ep=p2; color=c; 16 } 17 // 描画 18 void draw(Graphics g) { 19 g.setColor(color); 20 g.drawLine(sp.x, sp.y, ep.x, ep.y); 21 } 22} 23 24// JControlPanelクラス 25class JControlPanel extends JPanel implements ActionListener { 26 private JSimpleDrawMain app; 27 // コンストラクタ 28 public JControlPanel(JSimpleDrawMain app) { 29 super(new FlowLayout()); 30 this.app = app; 31 JComboBox<String> ch = new JComboBox<>(); 32 ch.addItem("Black"); 33 ch.addItem("Red"); 34 ch.addItem("Blue"); 35 ch.addItem("Green"); 36 ch.addItem("Yellow"); 37 ch.addItem("Gray"); 38 ch.addItem("Pink"); 39 ch.addActionListener(this); 40 add(ch); 41 42 JButton clearButton = new JButton("Clear"); 43 clearButton.addActionListener(this); 44 add(clearButton); 45 } 46 // アクション処理 47 @Override 48 public void actionPerformed(ActionEvent e) { 49 if(e.getSource() instanceof JComboBox) { 50 String arg = (String)((JComboBox<?>)e.getSource()).getSelectedItem(); 51 if(arg.equals("Black")) app.color=Color.BLACK; 52 else if(arg.equals("Red")) app.color=Color.RED; 53 else if(arg.equals("Blue")) app.color=Color.BLUE; 54 else if(arg.equals("Green")) app.color=Color.GREEN; 55 else if(arg.equals("Yellow")) app.color=Color.YELLOW; 56 else if(arg.equals("Gray")) app.color=Color.GRAY; 57 else if(arg.equals("Pink")) app.color=Color.PINK; 58 } 59 if(e.getSource() instanceof JButton) { 60 String arg = ((JButton)e.getSource()).getText(); 61 if(arg.equals("Clear")) app.clear(); 62 } 63 } 64} 65 66// JDrawCanvasクラス 67class JDrawCanvas extends JPanel { 68 private JSimpleDrawMain app; 69 private Point p1, p2; // 描画中の始点と終点 70 71 // コンストラクタ 72 public JDrawCanvas(JSimpleDrawMain app) { 73 super(null); 74 this.app = app; 75 setBackground(Color.WHITE); 76 77 addMouseListener(new MouseAdapter() { 78 // マウスボタンが押された 79 @Override 80 public void mousePressed(MouseEvent e) { 81 Graphics g = getGraphics(); 82 g.setXORMode(getBackground()); 83 p2 = p1 = new Point(e.getX(), e.getY()); 84 g.drawLine(p1.x, p1.y, p2.x, p2.y); 85 g.dispose(); 86 } 87 88 // マウスボタンが離された 89 @Override 90 public void mouseReleased(MouseEvent e) { 91 Graphics g = getGraphics(); 92 g.setXORMode(getBackground()); 93 g.drawLine(p1.x, p1.y, p2.x, p2.y); 94 g.setPaintMode(); 95 p2 = new Point(e.getX(), e.getY()); 96 if(app.line_num < JSimpleDrawMain.LINEMAX) { 97 app.lines[app.line_num] = new Line(p1, p2, app.color); 98 app.lines[app.line_num++].draw(g); 99 } 100 g.dispose(); 101 } 102 }); 103 104 addMouseMotionListener(new MouseMotionAdapter() { 105 // マウスがドラッグされた 106 @Override 107 public void mouseDragged(MouseEvent e) { 108 Graphics g = getGraphics(); 109 g.setXORMode(getBackground()); 110 g.drawLine(p1.x, p1.y, p2.x, p2.y); 111 p2 = new Point(e.getX(), e.getY()); 112 g.drawLine(p1.x, p1.y, p2.x, p2.y); 113 g.dispose(); 114 } 115 }); 116 } 117 // 再描画 118 public void paintComponent(Graphics g) { 119 super.paintComponent(g); 120 for(int i = 0; i < app.line_num; i++) 121 app.lines[i].draw(g); 122 } 123} 124 125public class JSimpleDrawMain extends JPanel { 126 static final int LINEMAX = 100; // 最大線数 127 int line_num; // 現在の線数 128 Line[] lines; // 線データ 129 Color color; // 現在の色 130 JDrawCanvas dc; // 描画キャンバス 131 132 // 初期化 133 public void init() { 134 setBackground(Color.white); 135 line_num = 0; 136 lines = new Line[LINEMAX]; 137 color = Color.BLACK; 138 setLayout(new BorderLayout()); 139 add(new JControlPanel(this), BorderLayout.SOUTH); 140 add(dc = new JDrawCanvas(this), BorderLayout.CENTER); 141 } 142 143 // メイン 144 public static void main(String[] args) { 145 JFrame f = new JFrame("JSimpleDrawMain"); 146 f.setSize(400,300); 147 JSimpleDrawMain a = new JSimpleDrawMain(); 148 f.add(a, BorderLayout.CENTER); 149 a.init(); 150 f.setVisible(true); 151 } 152 153 // クリア 154 public void clear() { 155 line_num = 0; 156 dc.repaint(); 157 } 158}

投稿2020/03/28 09:31

編集2020/03/29 06:22
jimbe

総合スコア12646

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

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

jimbe

2020/03/28 09:38

にしても, 鹿児島大学は未だに Vector とか AWT とか アプレットとかの記事を使っているのでしょうか.
Kazumannbo-

2020/03/28 09:59

ありがとうございます。 まだ初心者向けの参考書をみて学習している段階ですが色々と調べてみます
jimbe

2020/03/28 10:05

ついで…と言いますか, JFrame は Swing で Button は AWT です. Swing と AWT は混在させると異常動作を引き起こしますし, 基本設定から異なったり, 同じ処理でも使用すべきメソッドが異なったりします. (paint では無く paintComponent とか) 恐らく Swing もあまりお分かりになっていないと思いますので, そちらも頑張ってみてください.
Kazumannbo-

2020/03/29 01:54

ありがとうございます! 一通り調べて機能追加頑張ります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問