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

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

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

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

Q&A

解決済

1回答

4471閲覧

MouseListenerの登録ができない

chankane

総合スコア139

Java

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

0グッド

0クリップ

投稿2016/12/25 04:21

###前提・実現したいこと
こんにちは、毎度お世話になっております。JavaのMouseListenerについて質問させてください。
マウスのリスナーの登録をしたいのですがうまくいかないです。

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

Mouse.java:12: エラー: シンボルを見つけられません addMouseListener(this); ^ シンボル: メソッド addMouseListener(Mouse) 場所: クラス Mouse Mouse.java:13: エラー: シンボルを見つけられません addMouseMotionListener(this); ^ シンボル: メソッド addMouseMotionListener(Mouse) 場所: クラス Mouse エラー2個

###該当のソースコード

java

1import java.awt.event.MouseListener; 2import java.awt.event.MouseMotionListener; 3import java.awt.event.MouseEvent; 4 5public class Mouse implements MouseListener, MouseMotionListener{ 6 7 public int x; 8 public int y; 9 public int state; 10 11 public Mouse(){ 12 addMouseListener(this);//たぶんここでエラーが発生 13 addMouseMotionListener(this);//たぶんここでエラーが発生 14 } 15 16 //============================================================================ 17 //マウスがアップレット内に入った 18 //============================================================================ 19 public void mouseEntered(MouseEvent e){ 20 21 } 22 23 //============================================================================ 24 //マウスがアップレットの外に出た 25 //============================================================================ 26 public void mouseExited(MouseEvent e){ 27 28 } 29 30 //============================================================================ 31 //マウスが押された 32 //============================================================================ 33 public void mousePressed(MouseEvent e){ 34 //現在の座標を取得 35 } 36 37 //============================================================================ 38 //マウスが離された 39 //============================================================================ 40 public void mouseReleased(MouseEvent e){ 41 42 } 43 44 //============================================================================ 45 //マウスがクリックされた 46 //============================================================================ 47 public void mouseClicked(MouseEvent event){ 48 state = event.getButton(); 49 } 50 51 //============================================================================ 52 //マウスが動かされた 53 //============================================================================ 54 public void mouseMoved(MouseEvent event){ 55 x = event.getX(); 56 y = event.getY(); 57 state = event.NOBUTTON; 58 } 59 60 //============================================================================ 61 //マウスがドラッグされた 62 //============================================================================ 63 public void mouseDragged(MouseEvent event){ 64 x = event.getX(); 65 y = event.getY(); 66 state = event.getButton(); 67 } 68}

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

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

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

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

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

guest

回答1

0

ベストアンサー

addMouseListenerがこのクラスに定義されていないのがコンパイルエラーの原因です。

swingのイベントプログラミングにおいては以下の3つの役割があると思います。

  1. イベントを発生させる画面部品(イベントソース)

このような部品にaddXxxListenerメソッドが定義されています。
2. イベントを処理するもの(イベントハンドラー)
3. 特定のイベントソースのaddXxxListenerを呼び出してその部品のイベントを特定のハンドラーに結び付けるもの

質問コードでは2のクラスで3の役割をやろうとしていますがそれはあまり普通のやりかたではないと思います。普通は3を画面の初期化(例えばJFrameのコンストラクターなど)で行います。


追記:コメントを拝見して感じたのですが、質問者さんはメソッド(非staticメソッド)が特定のインスタンスに対して起動されるものだという点が曖昧なのかも知れませんね。

java

1class Mouse ... { 2 Mouse() { 3 JPanel panel = ...; 4 // JPanelに対してマウスイベントが起こったときのハンドラーを登録。 5 // JPanelも画面を構成する部品であり、マウスイベントを発生させる機能を持っています。 6 // だからaddMouseListenerが定義されており以下のように登録することができます。 7 panel.addMouseListener(...); 8 9 // 下のコードが誰に対して起動されるメソッド呼び出しなのかが曖昧なのでは? 10 addMouseListener(...); 11 // ==> 上のコードは以下と同じです。これはコンパイルエラーになります。 12 this.addMouseListener(...); 13 } 14}

this.addMouseListenerは自分自身(ここではMouseクラスのインスタンス)に対してのメソッド呼び出しです。もしこのメソッドが定義されていたとしたらその意味は「this(あるMouseクラスのインスタンス)からマウスイベントが発生したときのハンドラーを登録する」ということになるでしょう。しかしMouseはイベントハンドラーなのであって、イベントソースになるようなクラスではありません。それゆえにaddMouseListenerというメソッドは定義されてません。定義されてないメソッドは呼び出せないのでコンパイルエラーになります。

投稿2016/12/25 04:55

編集2016/12/25 13:36
KSwordOfHaste

総合スコア18392

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

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

chankane

2016/12/25 12:50

返信大変遅くなりました。申し訳ありません。 前回はありがとうございました。 さて、質問の件ですが、JPanelを継承したクラスからそのコンストラクタでaddXxxListenerと登録したらうまく作動しました。 今回の場合、イベントハンドラーのクラスから登録をしようとしたからいけなかったのですか?また、それが普通使わない方法なので今後そのような書き方をするのはやめたほうがいいですか?正直まだよくわかっておりません...。このうやむやを何とかしたいので、無理がないようでしたら、ご教授願えますでしょうか?もしくは一通り調べたのですが参考になるサイトなどをご存知でしたらURLなどを貼っていただけると幸いです。 最後にご回答ありがとうございました(*^-^*)
KSwordOfHaste

2016/12/25 13:14

MouseクラスのコンストラクターにあるaddMouseListenerは「どのインスタンスに対するメソッド起動なのか」おわかりでしょうか?コメントを拝見していてその点が曖昧であるように思いました。
chankane

2016/12/25 14:51

ご回答ありがとうございました。いろいろ調べたり試したりしておりました。私自身c,c++のような手続き型言語の出なのでどうもまだ慣れていない感じが今もあります。 JPanel, JFrame ...といったものは、画面を構成する部品だからイベントソース側のクラス。また、それ以外のクラスはイベントハンドラーにしかなれないからaddもできないという解釈に落ち着きました。 間違っていたらすいまsん。たびたび質問に丁寧に答えていただきありがとうございました。
KSwordOfHaste

2016/12/25 15:56

そんな感じです。swingに限らず、「ユーザーによるアクション(マウスやキー操作など)をイベントとしてハンドラーへ通知する」という考え方は多くのGUIシステムで採用されているので、多くの場合画面部品がイベントソースになるという考え方が通用すると思います。
chankane

2016/12/26 03:10

こんにちは。ありがとうございます。まだまだ勉強不足だと痛感いたしました。イベントソースとイベントハンドラについてもこれから勉強していきたいと思いました。日をまたぎますが、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問