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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1071閲覧

javaにおいて,マウスドラッグのイベント処理

Katagiri

総合スコア1

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

1グッド

0クリップ

投稿2022/07/19 15:47

編集2022/07/21 00:18

前提

eclipse を用いて,Javaのコードを組んでいます。初心者です。

出来る限り現在の形を崩さずに,解決方法を見つけたいです。
少し見づらかったり,コードが非効率的なところは目をつむって頂けると幸いです。

実現したいこと

- マウスをドラッグし始めた時点の座標 (x0,y0)
- マウスをドラッグしている現行の座標 (x1, y1)
の二つを同時にドラッグ中にラベル(jl3)に表示するプログラムです。
※そのほか機能を実装していますが,気にしないでください

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

マウスをドラッグし始めた座標(ドラッグの開始座標)をどうやって示すのかが分かりません。

該当のソースコード

java

1public static void main(String[] args) { 2 // TODO 自動生成されたメソッド・スタブ 3 4 5 6 JLabel jl1 = new JLabel(); 7 JLabel jl2 = new JLabel(); 8 JLabel jl3 = new JLabel(); 9 JButton jb = new JButton("ボタン"); 10 11 JFrame jf1 = new JFrame("課題6"); 12 jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 13 jf1.setSize(480,360); 14 jf1.setLocationRelativeTo(null); 15 JFrame jf2 = new JFrame("課題6"); 16 jf2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 17 jf2.setSize(480,360); 18 jf2.setLocationRelativeTo(null); 19 JFrame jf3 = new JFrame("課題6"); 20 jf2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 jf2.setSize(480,360); 22 jf2.setLocationRelativeTo(null); 23 24 JPanel cp = (JPanel)jf1.getContentPane(); 25 cp.setLayout(new GridLayout(2,1)); 26 27 28 JPanel cp1 = (JPanel)jf2.getContentPane(); 29 cp1.setLayout(new GridLayout(1,3));{ 30 //1段目ラベル部分のコード 31 32 jl1.setHorizontalAlignment(SwingUtilities.CENTER); 33 jl1.setText("ラベル1"); 34 jl2.setHorizontalAlignment(SwingUtilities.CENTER); 35 jl2.setText("ラベル2"); 36 37 cp1.add(jb); 38 cp1.add(jl1); 39 cp1.add(jl2); 40 } 41 cp.add(cp1); 42 43 JPanel cp2 = (JPanel)jf3.getContentPane(); 44 cp2.setLayout(new GridLayout());{ 45 //2段目ラベル部分のコード 46 47 jl3.setHorizontalAlignment(SwingUtilities.CENTER); 48 jl3.setText("MOUSE_MOVED:(x,y)"); 49 cp2.add(jl3); 50 51 } 52 cp.add(cp2); 53 54 jb.addMouseListener(new MyMouseListener1(){ 55 public void mouseClicked(MouseEvent e) { 56 } 57 public void mouseEntered(MouseEvent e) { 58 jl3.setText("MOUSE_ENTERED"); 59 } 60 public void mouseExited(MouseEvent e) { 61 jl3.setText("MOUSE_EXITED"); 62 } 63 public void mousePressed(MouseEvent e) { 64 } 65 public void mouseReleased(MouseEvent e) { 66 } 67 }); 68 69 jl1.addMouseListener(new MyMouseListener2() { 70 public void mouseClicked(MouseEvent e) { 71 } 72 public void mouseEntered(MouseEvent e) { 73 } 74 public void mouseExited(MouseEvent e) { 75 } 76 public void mousePressed(MouseEvent e) { 77 jl3.setText("MOUSE_PRESSED"); 78 } 79 public void mouseReleased(MouseEvent e) { 80 jl3.setText("MOUSE_RELEASED"); 81 } 82 }); 83 /////////////////////該当部分//////////////////////// 84 jl2.addMouseMotionListener(new MyMouseAdapter(){ 85 86 int x0; 87 int y0; 88 int x1; 89 int y1; 90 91 public void mouseDragged(MouseEvent e) { 92 x0 = e.getX(); 93 y0 = e.getY(); 94 x1 = e.getX(); 95 y1 = e.getY(); 96 jl3.setText("MOUSE_DRAGGED:("+x0+","+y0+")-("+x1+","+y1+")"); 97 } 98 ///////////////////////////////////////////// 99 public void mouseMoved(MouseEvent e) { 100 int x = e.getX(); 101 int y = e.getY(); 102 103 jl3.setText("MOUSE_MOVED:("+x+","+y+")"); 104 } 105 }); 106 107 jl2.addMouseListener(new MyMouseListener1(){ 108 public void mouseClicked(MouseEvent e) { 109 int count = e.getClickCount(); 110 if(count == 1) { 111 jl3.setText("MOUSE_CLICKED"); 112 }else { 113 jl3.setText("MOUSE_DOUBLE_CLICKED"); 114 } 115 116 } 117 public void mouseEntered(MouseEvent e) { 118 } 119 public void mouseExited(MouseEvent e) { 120 } 121 public void mousePressed(MouseEvent e) { 122 } 123 public void mouseReleased(MouseEvent e) { 124 } 125 }); 126 127 jf1.setVisible(true); 128 } 129 130} 131 132class MyMouseListener1 implements MouseListener{ 133 public void mouseClicked(MouseEvent e) { 134 } 135 public void mouseEntered(MouseEvent e) { 136 } 137 public void mouseExited(MouseEvent e) { 138 } 139 public void mousePressed(MouseEvent e) { 140 } 141 public void mouseReleased(MouseEvent e) { 142 } 143} 144 145class MyMouseListener2 implements MouseListener{ 146 public void mouseClicked(MouseEvent e) { 147 } 148 public void mouseEntered(MouseEvent e) { 149 } 150 public void mouseExited(MouseEvent e) { 151 } 152 public void mousePressed(MouseEvent e) { 153 } 154 public void mouseReleased(MouseEvent e) { 155 } 156} 157 158 159class MyMouseAdapter extends MouseAdapter{ 160 public void mouseDragged(MouseEvent e) { 161 } 162 public void mouseMoved(MouseEvent e) { 163 } 164 public void mouseClicked(MouseEvent e) { 165 } 166}

試したこと

マウスをクリックした時点の座標をイベント処理に組み込もうとしてみましたが,数値を引き継がないのでダメでした…

TN8001👍を押しています

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

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

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

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

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

jimbe

2022/07/19 16:14

コードのマークダウンが妙なコトになってしまっているようで、表示が崩れています。 質問は編集出来ますし、プレビューもあるはずですので、「###該当のソースコード」より前にある ``` の行等を削除してコード部分のみが枠に入っているか見てみてください。
Katagiri

2022/07/19 16:32

ご指摘ありがとうございます。修正しました。 これで少しは見やすくなったかと思われます。
jimbe

2022/07/19 16:51

見易くなりました。ありがとうございます。
dodox86

2022/07/20 02:30

元が英語のものを日本語発音にすることの差はありますが、”drag"は一般的にはドラックとは言わず、ドラッグです。ドラッグアンドドロップ(drag and drop)のドラッグ。 また、ここで言うドラッグとは「マウスのボタンを押下したまま、ズリズリズリと引っ張ってボタンを離すまで」を指していますでしょうか。
Katagiri

2022/07/20 02:47

ご指摘ありがとうございます。 ご指摘の通り、ドラック→ドラッグのことでした。修正致しました。
guest

回答2

0

ベストアンサー

出来る限り現在の形を崩さずに,解決方法を見つけたいです。
少し見づらかったり,コードが非効率的なところは目をつむって頂けると幸いです。

多少の突っ込みどころ(MyMouseListener1MyMouseListener2MyMouseAdapterの存在意義とか)はまあいいです。

しかしjf2jf3cp1cp2はさすがに看過できません。

Java

1JPanel cp1 = new JPanel(new GridLayout(1, 3)); 2JPanel cp2 = new JPanel(new GridLayout());

とするだけで済むところを無駄にJFrameを作っているのは、クラスやインスタンスの理解が不十分だと(先生に)思われてしまうでしょう。

マウスをクリックした時点の座標をイベント処理に組み込もうとしてみましたが,数値を引き継がないのでダメでした…

Java

1jl2.addMouseListener(new MyMouseAdapter(){ /* 省略 */ }); 2jl2.addMouseMotionListener(new MyMouseAdapter(){ /* 省略 */ });

みたいな話でしょうか?
同じインスタンスをaddMouseListeneraddMouseMotionListenerしなければなりません。


Java

1import javax.swing.*; 2import java.awt.GridLayout; 3import java.awt.event.*; 4 5public class Kadai6 { 6 public static void main(String[] args) { 7 JFrame frame = new JFrame("課題6"); 8 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 9 frame.setSize(480, 360); 10 frame.setLocationRelativeTo(null); 11 frame.setLayout(new GridLayout(2, 1)); 12 13 14 JPanel panel = new JPanel(new GridLayout(1, 3)); 15 frame.add(panel); 16 17 JButton button = new JButton("ボタン"); 18 panel.add(button); 19 20 JLabel label1 = new JLabel("ラベル1"); 21 label1.setHorizontalAlignment(JLabel.CENTER); 22 panel.add(label1); 23 24 JLabel label2 = new JLabel("ラベル2"); 25 label2.setHorizontalAlignment(JLabel.CENTER); 26 panel.add(label2); 27 28 29 JLabel label3 = new JLabel("ラベル3"); 30 label3.setHorizontalAlignment(JLabel.CENTER); 31 frame.add(label3); 32 33 34 MouseAdapter listener = new MouseAdapter() { 35 private int x0, y0; 36 37 @Override public void mousePressed(MouseEvent e) { 38 x0 = e.getX(); 39 y0 = e.getY(); 40 } 41 42 @Override public void mouseDragged(MouseEvent e) { 43 int x1 = e.getX(); 44 int y1 = e.getY(); 45 label3.setText("MOUSE_DRAGGED:(" + x0 + "," + y0 + ")-(" + x1 + "," + y1 + ")"); 46 } 47 }; 48 49 label2.addMouseListener(listener); 50 label2.addMouseMotionListener(listener); 51 52 53 frame.setVisible(true); 54 } 55}

投稿2022/07/20 10:23

TN8001

総合スコア9244

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

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

Katagiri

2022/07/20 15:16

ご指摘いただいた通りに直してみましたが,プログラムがかなりすっきりしました。 考えていた方策に近い形だったので,ストンと理解ができました。ありがとうございました!
guest

0

ご自身のコードの形はあまり変えたくないそうですので、(どの質問でも結局はそうなのですが)サンプル・参考ということでコードを作りました。
ドラッグの開始はボタン押下ですので、 MouseListener と MouseMotionListener の両方を実装したクラス(DragTestFrame では DragListener) で、 mousePressed の位置を開始点として保存し、 mouseDragged の位置を終了点として表示することになります。

DragTestFrame.java

java

1import java.awt.event.*; 2 3import javax.swing.*; 4 5public class DragTestFrame extends JFrame { 6 public static void main(String[] args) { 7 SwingUtilities.invokeLater(() -> new DragTestFrame().setVisible(true)); 8 } 9 10 DragTestFrame() { 11 super("DragTestFrame"); 12 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 13 setSize(480,360); 14 setLocationRelativeTo(null); 15 16 JLabel label = new JLabel(); 17 label.setHorizontalAlignment(SwingUtilities.CENTER); 18 add(label); 19 20 DragListener dragListener = new DragListener(label); 21 label.addMouseListener(dragListener); 22 label.addMouseMotionListener(dragListener); 23 } 24 25 static class DragListener implements MouseListener, MouseMotionListener { 26 private JLabel label; 27 private int pressedX, pressedY; 28 29 DragListener(JLabel label) { 30 this.label = label; 31 } 32 33 @Override 34 public void mouseClicked(MouseEvent e) {} 35 @Override 36 public void mousePressed(MouseEvent e) { 37 pressedX = e.getX(); 38 pressedY = e.getY(); 39 label.setText("MOUSE_PRESSED:("+e.getX()+","+e.getY()+")"); 40 } 41 @Override 42 public void mouseReleased(MouseEvent e) { 43 label.setText(""); 44 } 45 @Override 46 public void mouseEntered(MouseEvent e) {} 47 @Override 48 public void mouseExited(MouseEvent e) {} 49 50 @Override 51 public void mouseDragged(MouseEvent e) { 52 label.setText("MOUSE_DRAGGED:("+pressedX+","+pressedY+")-("+e.getX()+","+e.getY()+")"); 53 } 54 @Override 55 public void mouseMoved(MouseEvent e) {} 56 } 57}

投稿2022/07/20 04:30

編集2022/07/20 04:30
jimbe

総合スコア12545

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

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

Katagiri

2022/07/20 15:18

ご指摘ありがとうございました。 サンプルプログラムでかなり理解が進みました。 結果的に自分でなんとかする際にはこのプログラムを用いることはありませんでしたが,未だ理解が及んでいない部分をこちらのプログラムで補いたいと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問