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

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

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

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

Q&A

解決済

2回答

2406閲覧

javaプログラミングのマウスイベント

kitagawasho

総合スコア28

Java

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

0グッド

0クリップ

投稿2019/01/06 12:39

前提・実現したいこと

Javaでマウスをクリックすると点が付き、それを3回繰り返すと3点をつないだ三角形になるプログラミングを行いたい。

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

4回目クリックされたら三角形を削除したい(初期状態に戻したい) 3回クリックしたらその3点をつないで三角形を作りたいがどこでその動作を作ればいいかまたその動作もわからない。

該当のソースコード

Java

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.*; 4 5class PaintTriangle extends JFrame{ 6 int x=-10,y=-10; 7 public static void main(String args[]){ 8 PaintTriangle tm = new PaintTriangle("三角形の描画"); 9 } 10 PaintTriangle( String title ){ 11 setTitle(title); 12 setBounds(100, 100, 300, 200); 13 setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 14 15 ExPanel ep = new ExPanel(); 16 ep.setBackground( Color.yellow ); 17 add( ep, BorderLayout.CENTER ); 18 ep.addMouseListener(new MyMouseListener ()); 19 setVisible(true); 20 } 21 class ExPanel extends JPanel{ 22 public void paintComponent(Graphics g){ 23 super.paintComponent(g); 24 g.setColor(Color.blue); 25 g.fillOval(x,y,10,10); 26 } 27 } 28 class MyMouseListener implements MouseListener{ 29 public void mousePressed(MouseEvent e){ 30 for(int i=0;i<4;i++){ 31 if(i>4){ 32 repaint(); 33 } 34 } 35 } 36 public void mouseRelessed(MouseEvent e){ 37 38 } 39 public void mouseClicked(MouseEvent e){ 40 41 } 42 public void mouseEntered(MouseEvent e){ 43 44 } 45 public void mouseExited(MouseEvent e){ 46 47 } 48 } 49 50} 51

試したこと

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

swingでのイベントドリブン(イベントにより処理が駆動されるという意)方式でマウスボタンが押下されたときの処理を考えるときの要点は

  • イベントが起きたら、MouseListenerインスタンスに対してmousePressedメソッド(インスタンスメソッド)が呼び出される
  • mousePressedは起動の原因になった1回分のマウスイベントについてのみ処理を行う。

1回分のマウスイベントに対する処理が終わったら直ちにreturnしてください。
質問者さんのコードを拝見するとmousePressedの中でforループを記述していることから「次々に発生するマウスイベントの発生を待ちながら順に何かする」という意図がくみ取れます。その考え方はNGなのです。

では4回のマウス操作をどうやって捉えればよいかといえば、「mousePressedメソッドからアクセスできるようなどこか適当な場所に呼び出された回数を覚えておけばよい」です。それさえあれば呼び出し回数が3回目のとき三角形を生成し、4回目で三角形を消去・・・といった条件分岐が書けます。そこまでわかれば3回目の呼び出しの際に1回目と2回目にどの座標でマウスが押下されたかをどうやって知るかもわかるはずです。同様に覚えておけばよいのです。

投稿2019/01/06 14:10

KSwordOfHaste

総合スコア18392

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

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

0

以下コードです
(悪コードだったので削除させていただきました。修正版の方をお読みください。)
(これも悪コードかもしれませんが)

修正版

Java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.awt.Point; 5import java.awt.event.MouseEvent; 6import java.awt.event.MouseListener; 7 8import javax.swing.JFrame; 9import javax.swing.JPanel; 10 11public class PaintTriangle extends JFrame { 12 13 class mouseEvent implements MouseListener { 14 15 int time = 0; 16 Point point[] = new Point[3]; 17 18 @Override 19 public void mouseClicked(MouseEvent e) {} 20 21 @Override 22 public void mouseEntered(MouseEvent e) {} 23 24 @Override 25 public void mouseExited(MouseEvent e) {} 26 27 @Override 28 public void mousePressed(MouseEvent e) { 29 Graphics g = getGraphics(); 30 time++; 31 32 if (time == 4) { 33 time = 0; 34 repaint(); 35 } else { 36 point[time - 1] = e.getPoint(); 37 g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); 38 if (time == 3) { 39 g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY()); 40 g.drawLine((int) point[1].getX(), (int) point[1].getY(), (int) point[2].getX(), (int) point[2].getY()); 41 g.drawLine((int) point[2].getX(), (int) point[2].getY(), (int) point[0].getX(), (int) point[0].getY()); 42 } 43 } 44 45 } 46 47 @Override 48 public void mouseReleased(MouseEvent e) {} 49 50 } 51 52 public static void main(String[] args) { 53 new PaintTriangle("三角形の描画"); 54 } 55 56 PaintTriangle(String title) { 57 setTitle(title); 58 setBounds(100, 100, 300, 200); 59 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 60 setVisible(true); 61 JPanel panel = new JPanel(); 62 panel.setBackground(Color.yellow); 63 add(panel, BorderLayout.CENTER); 64 addMouseListener(new mouseEvent()); 65 } 66} 67

やっていること

  • mousePressedから押した座標を取得する
  • drawLine(startX, startY, endX, endY)で描画する(点ならstartXとendX,startYとendYは同じにする)
  • mouseEventクラス内にtime(int型)を用意し、何回クリックしたかを記録している

質問者さんはJPanel(ExPanel)の方にaddMouseListner()としていたようですが縦に30、横に10ほどずれが生じます。(故に最初変なコードになったわけですが)
KSwordOfHasteさんが仰る通り、mousePressedはマウス1回のクリックにつき1度行われます。

if (time == 3) { g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY()); g.drawLine((int) point[1].getX(), (int) point[1].getY(), (int) point[2].getX(), (int) point[2].getY()); g.drawLine((int) point[2].getX(), (int) point[2].getY(), (int) point[0].getX(), (int) point[0].getY()); }

(僕のコード)ここについては、全てint型にキャストしているのですが、ここはあまり良くないコードかと思いました。下のコードの方が良いかもしれません。(これもわざわざDotクラスを作っているのでどちらが良いのかはわかりませんが)

Java

1import java.awt.BorderLayout; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.awt.event.MouseEvent; 5import java.awt.event.MouseListener; 6 7import javax.swing.JFrame; 8import javax.swing.JPanel; 9 10public class PaintTriangle extends JFrame { 11 12 class Dot { 13 14 private int x, y; 15 16 Dot() { 17 x = 0; 18 y = 0; 19 } 20 21 Dot(int x, int y) { 22 this.x = x; 23 this.y = y; 24 } 25 26 public int getX() { 27 return x; 28 } 29 30 public int getY() { 31 return y; 32 } 33 } 34 35 class mouseEvent implements MouseListener { 36 37 int time = 0; 38 Dot dot[] = new Dot[3]; 39 40 @Override 41 public void mouseClicked(MouseEvent e) {} 42 43 @Override 44 public void mouseEntered(MouseEvent e) {} 45 46 @Override 47 public void mouseExited(MouseEvent e) {} 48 49 @Override 50 public void mousePressed(MouseEvent e) { 51 Graphics g = getGraphics(); 52 time++; 53 54 if (time == 4) { 55 time = 0; 56 repaint(); 57 } else { 58 dot[time - 1] = new Dot(e.getX(), e.getY()); 59 g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); 60 if (time == 3) { 61 g.drawLine(dot[0].getX(), dot[0].getY(), dot[1].getX(), dot[1].getY()); 62 g.drawLine(dot[1].getX(), dot[1].getY(), dot[2].getX(), dot[2].getY()); 63 g.drawLine(dot[2].getX(), dot[2].getY(), dot[0].getX(), dot[0].getY()); 64 } 65 } 66 67 } 68 69 @Override 70 public void mouseReleased(MouseEvent e) {} 71 72 } 73 74 public static void main(String[] args) { 75 new PaintTriangle("三角形の描画"); 76 } 77 78 PaintTriangle(String title) { 79 setTitle(title); 80 setBounds(100, 100, 300, 200); 81 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 82 setVisible(true); 83 JPanel panel = new JPanel(); 84 panel.setBackground(Color.yellow); 85 add(panel, BorderLayout.CENTER); 86 addMouseListener(new mouseEvent()); 87 } 88} 89

ところで僕の知識不足なのですが、

g.setColor(Color.blue); g.fillOval(x,y,10,10);

この部分は何のために書いたのでしょうか?
僕にはわからなかったのですが、後学のために教えていただきたいと思っています。

投稿2019/01/06 13:45

編集2019/01/06 14:33
CreeperSaviour

総合スコア129

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問