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

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

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

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

Q&A

解決済

1回答

857閲覧

panel上の画像でMouseListenerを取得するには

TakayaShima

総合スコア13

Java

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

0グッド

0クリップ

投稿2018/12/14 08:10

実現したいこと

"MouseListenerイベントを取得して、クリック時に描画する。"

ー詳細ー
ImageJ用のプラグインを作成しています。

1.mainパネルの生成。
2.”open&run”をクリックするとダイアログが表示される。
3.画像サイズが等しいファイルを2つ選択。
4.新しいwindowを生成する。

4.のWindow上では、
this.imp.getProcessor().copyBits(aviMovie.ip, 1, 1, Blitter.COPY);
で画像が描画されています。

イメージ説明

このとき、addMouseListener(this);を実行すると
Panelの描画されている部分のみClickEventが反応しません。

おそらく、描画されているため、addMotionListener()の指定が適切でない(thisではない)からと考えています。

ー質問内容ー
画像を描画したときのaddMouseListenerはどうすればよいでしょうか。

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

エラーメッセージ

該当のソースコード

java(ImageJのプラグインを使用)

1import... 2 3public class split2_2 implements PlugIn{ 4 5 class AVIMovie{... 6 class PreviewWindow extends ImageWindow implements ActionListener,ItemListener, 7 WindowListener, ChangeListener, MouseListener{ 8・・・ 9 10 void addPanel() { 11 /* 12 (1)指定したレイアウトに設定する. 13 (2)水平方向のスライダーを生成 14 (3)ChangeEventを適用させる 15 (4)panelに追加する 16 */ 17 Panel panelSlider = new Panel(); 18 19 panelSlider.setLayout(new GridLayout(0, 1, 0, 0));//(1) 20 slider = new JSlider(JSlider.HORIZONTAL); //(2) 21 slider.setPreferredSize(new Dimension(400, 20)); 22 23 slider.addChangeListener(this); //(3) 24 panelSlider.add(slider); 25 add(panelSlider); //(4) 26 27 Panel panel = new Panel(); 28 panel.setLayout(new GridLayout(0, 5, 10, 10)); 29 btnFirst = new Button(" << "); 30 btnFirst.addActionListener(this); 31 panel.add(btnFirst); 32 33 btnPrev = new Button(" < "); 34 btnPrev.addActionListener(this); 35 panel.add(btnPrev); 36 37 btnPlay = new Button(" Play "); 38 btnPlay.addActionListener(this); 39 panel.add(btnPlay); 40 41 btnNext = new Button(" > "); 42 btnNext.addActionListener(this); 43 panel.add(btnNext); 44 45 btnLast = new Button(" >> "); 46 btnLast.addActionListener(this); 47 panel.add(btnLast); 48 49 labelCurr = new JLabel ("Current Frame"); 50 panel.add(labelCurr); 51 52 txtCurrFrame = new TextField(); 53 txtCurrFrame.setText("1"); 54 txtCurrFrame.addActionListener(this); 55 panel.add(txtCurrFrame); 56 57 labelCurr = new JLabel ("Delay"); 58 panel.add(labelCurr); 59 60 txtDelay = new TextField(); 61 txtDelay.addActionListener(this); 62 panel.add(txtDelay); 63 64 empty = new JLabel (""); 65 panel.add(empty); 66 67 paintCheck = new Checkbox(" paint "); 68 paintCheck.addItemListener(this); 69 panel.add(paintCheck); 70 71 splitCursor = new Checkbox(" splitCursor "); 72 splitCursor.addItemListener(this); 73 panel.add(splitCursor); 74 75 **addMouseListener(this);** 76 77 78 add(panel); 79 pack(); 80 } 81・・・ 82 83 84 85 private void InitGUI() { 86 /* 87 (1)DelayのテキストBOXに10を設定 88 (2)最小値を上書きする 89 (3)最大値を上書きする 90 (4)スライダーをはじめに設定する 91 (5)フレームをコピーして,生成したキャンバスに上書きする 92 (6)(5)の左側 93 */ 94 try { 95 txtDelay.setText("10"); //(1) 96 slider.setMinimum(iStartFrame); //(2) 97 slider.setMaximum(iStopFrame); //(3) 98 slider.setValue(1); //(4) 99 100 this.imp.getProcessor().copyBits(aviMovie.ip, 1, 1, Blitter.COPY); //(5) 101 this.imp.getProcessor().copyBits(aviMovie.ip2, width + 2, 1, Blitter.COPY); //(6) 102 this.imp.updateAndDraw(); 103 104 UpdateTitle(); 105 } 106 catch (Exception e) { 107 String msg = e.getMessage(); 108 if (msg == null || msg.equals("")) {msg = "" + e;} 109 IJ.showMessage("ALEMBIC AVI Splitter", "InitGUI: " + msg); 110 } 111 bInitGUI = false; 112 } 113 114 ・・・ 115 @Override 116 public void mouseMoved(int x, int y) { 117 /* 118 ImageWindowのメソッドmouseMovidは座標を取得する 119 (1)右画面を初期化する 120 (2)カーソルを複製するか判定 121 (3)iconの画像を画面上に表示 122 (4)再生中にカーソルが移動したとき,再生を停止させる. 123 (5)画面をアップデート 124 */ 125 try{ 126 pointX = x; 127 pointY = y; 128 if(splitCursor.getState()) { //(2) 129 if(width-2 > pointX && height-2 > pointY) { 130 this.imp.getProcessor().copyBits(aviMovie.ip2, width + 2, 1, Blitter.COPY);//(1) 131 132 133 this.imp.getProcessor().copyBits(aviMovie.ipIcon, pointX + width + 2, pointY + 1, Blitter.COPY);//(3) 134 135 if(!bStop) {bStop = true;}//(4) 136 } 137 } 138 this.imp.updateAndDraw();//(5) 139 140 } 141 catch (Exception e) { 142 String msg = e.getMessage(); 143 if (msg == null || msg.equals("")) {msg = "" + e;} 144 IJ.showMessage("ALEMBIC AVI Splitter", "mouseMoved(): " + msg); 145 } 146 } 147 148 149 @Override 150 public void mouseClicked(MouseEvent e) { 151 IJ.log("a"); 152 /* 153 this.setVisible(true); 154 this.g = this.getGraphics(); 155 g.setColor(Color.RED); 156 g.fillOval(pointX,pointY,10,10); 157 g.dispose(); 158 */ 159 } 160 161 @Override 162 public void mousePressed(MouseEvent e) { 163 } 164 165 @Override 166 public void mouseReleased(MouseEvent e) { 167 } 168 169 @Override 170 public void mouseEntered(MouseEvent e) { 171 if(!paintCheck.getState())UpdateCurrGUI(); 172 } 173 174 @Override 175 public void mouseExited(MouseEvent e) { 176 if(!paintCheck.getState())UpdateCurrGUI(); 177 178 } 179 180 181 } 182 183

試したこと

imp.addListener(this);
で実行するとImagePlus型とImageListener型は一致しないというError

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

versionはjdck1.8.0_191です

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

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

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

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

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

guest

回答1

0

ベストアンサー

ここで描画、当ソース見てわかりにくかったので別ソース書きます。
私だったらこんな感じにしますかね。

swing

1MyLabel label = new MyLabel( イメージのパス );
class MyLabel extends JLabel implements MouseMotionListener { MyLabel() { addMouseMotionListener( this ); } // 実装 }

API見てないので少しメチャクチャかもしれませんが、こんな感じでどうでしょうか。

投稿2018/12/14 08:52

yukkuri

総合スコア624

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問