ListenerとAdapterの関係がよく分かりません

このQ&Aのポイント
  • Jappletを使う際に混乱してしまうListenerとAdapterの違いについて教えてください。
  • Listenerの登録にはkeyAdapterやmouseAdapterが使用されますが、ActionAdapterは使われないようです。
  • また、Adapterを使わずにkeyListenerやmouseListenerだけで同じ動きをするプログラムを作成することは可能でしょうか。
回答を見る
  • ベストアンサー

ListenerとAdapterの関係がよく分かりません

実に初歩的な質問なのですが、Jappletを使う際、ListenerとAdapterがどうしても混乱してしまいます。 keyAdapterやmouseAdapterを使いたいとき、リスナー登録というものをするようですが 例えば、ActionListenerを使う時は、ActionAdapterというものは使わない気がします。 これらの違いは何なのでしょうか。 また、Adapterを使わずに、keyListenerやmouseListenerのみで、Adapterと同様の動きをするプログラムは作れますか。 簡単な例でいいので、ご教授おねがいできないでしょうか。 それではよろしくおねがいします。

  • Java
  • 回答数1
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#94983
noname#94983
回答No.1

Listenerというのはインターフェイスだ。これは、implementsすると、すべてのメソッドを実装しなければいけない。となると、例えばものによっては「1つのメソッドだけしか使わない」というときでも、空のメソッドを3つも4つも書かないといけないことになる。例えばマウスクリックだけしか使わないのに、MouseListenerをimplementsして「あ~めんどくせ~」とかいいながら使いもしないmouseEnteredだのmouseExsitedなど書くのはバカらしいだろう。 これは面倒だってんで、あらかじめListenerをimplements済みにしてあるAdapterを用意した、ということ。これなら、使いたいメソッドだけを書けばいい。Listenerのように、使いもしないメソッドまで全部書く必要は無い。要するに「面倒くさい人向けの、Listener組み込み済みクラス」であって、「面倒くさかったら、こんなんありますよ」というだけなので、別にこれを使わずListenerを使ったってぜんぜんかまわない。 では、なぜActionAdapterはないか?というと、ActionListenerには1つのメソッドしかないため。これを使う場合は、必ずこのメソッドを書くことになる。したがって、Adapterをわざわざ用意する必要が無い。というわけで、Adapterは、メソッドが2つ以上あるListenerに対してのみ用意されている。

PurplePers
質問者

お礼

なんだかややこしいですが、Adapterというのは便利で汎用的なメソッドなのですね。 小難しいですがなんとか使いこなそうと努力はしてみます。 ありがとうございました。

関連するQ&A

  • Draw2Dでのイベント検知

    SWT + GEF(Draw2D) でGUIアプリケーションを作成しています。 FigureCanvasにPanelを張り、その上にFigure(例えばLabel)を追加し、マウスドラッグによるFigureの移動機能を追加しよう試行錯誤しています。 最初はLabelにMouseMotionListenerを登録してmouseDraggedを実装する方法をとっていたのですが、カーソルを早く動かしてLabelの外にカーソルが出てしまうと移動が止まってしまうという減少に陥りました。 そこで、LabelにMouseListenerを登録して移動するラベルを検知し、MouseMotionListenerをPanelに登録して検知したLabelのドラッグを実現させました。 ところが今度は、カーソルがLabel上にあるときにPanelに登録したリスナでイベントを検知できず、Labelの外にカーソルが移動してPanel領域に触れたときに初めてイベントを検知して移動ができるという現象に陥っています。(←つまり動きがカクカクする) SwingだとJPanel上にある部品の上にカーソルがある場合も、JPanelに登録したリスナでイベントを検知してくれるようなのですが、どう対処すればよいでしょうか。

    • ベストアンサー
    • Java
  • javaアプレットについて質問です

    本の通りにソースを記入し、コンパイラしました。 その後実行したら Exception in thread"main"java.lang.NoSuchMethodError:main とコマンドプロンプトに表示されました。 何が原因ですか? 因みに下記がソースコードです import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Sample13 extends JApplet { private JLabel lb; private JTextField tf; public void init() { //コンポーネントの作成 lb = new JLabel("お選びください。"); tf = new JTextField(); //コンテナへ追加 add(lb, BorderLayout.NORTH); add(tf, BorderLayout.SOUTH); //リスナの登録 tf.addActionListener(new SampleActionListener()); } //リスナクラス class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JTextField tmp = (JTextField) e.getSource(); lb.setText(tmp.getText() + "ですね。"); } } }

  • キーリスナー

     キーリスナーが上手く使えないでいます。  Ctrl キーとボタンを押せばそれぞれのメッセージが出るようなプログラムを次のように作ります。 import java.awt.*; import java.awt.event.*; public class KL extends Frame implements KeyListener, MouseListener { KL() { setLayout(null); setBounds(400,400,100,100); addKeyListener(this); addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}}); Button b=new Button(); b.setBounds(25,50,50,20); b.addMouseListener(this); // add(b); setVisible(true); } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==17) {System.out.println("Ctrl キーが押されました。"); } } public void mouseClicked(MouseEvent e) { System.out.println("ボタンがクリックされました。"); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public static void main(String args[]) { KL k_listener=new KL(); } }  このプログラムでは、ダブルのスラッシュを附けてボタンの貼り附けを止めています。この形で実行すればキーリスナーは働くのです。しかしスラッシュを取ってボタンを貼り附けると、マウスリスナーだけが有効になってキーリスナーは失効します。両立しません。リスナーを二つの内部クラスに分けて使うなど多少の工夫はしてみましたが、上手く行きません。  どうすれば両方のリスナーが使えるようになるでしょうか。

    • ベストアンサー
    • Java
  • Graphicsクラスを使って描画履歴を残して、しかも色も選択しながら描画を行いたい

    以下のようなドロープログラムを作ってみたのですが 描画色を変更して再描画すると前の描画履歴が消えてしまいます 描画色を変更しても以前の描画履歴の消えないようにするには どのようにすればいいのでしょうか。 文字数制限によりプログラムをアップできませんでしたので一部を記述させていただきます。 グローバルなカラーオブジェクトを用意し class Globe{ static mycol=Color.white; } 二つのラベルを用意して Label red=new Label("■"); Label green=new Label("■"); ラベルそれぞれにマウスリスナーを登録して red.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ GLobe.mycol=Color.red; } }); green.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ GLobe.mycol=Color.green; } }); マウスドラッグによる座標取得を行い public void mouseDragged(MouseEvent e){ x=e.getX(); y=e.getY(); repaint(); } 二つの色を使い分けて描画できるようにしました。 public void update(Graphics g){ setForeground(Globe.mycol); g.fillOval(x-3,y-3,6,6); }

    • ベストアンサー
    • Java
  • removeEventListenerについて

    JavaScript勉強中なのですが、removeEventListener("mousemove",funcname,!1)というメソッドの使い方というか、使い所がイマイチピンとこなくてこまっています。 addEventListener("mousemove",funcname,!1)で登録したイベントリスナーを削除するということだと思うのですが、削除した場合としなかった場合の違いって具体的にどういったことなんでしょうか? メモリリークとかの問題なのでしょうか? また、具体的に使う場合の簡単な例を教えてもらえないでしょうか? よろしくお願いいたします。

  • 複数線を引くには?

    最近プログラミングを習いだし、1つずつ色々独学で学んでいて、 本に載っている範囲で勉強しているます。 ここから下のプログラミングでは1つしか線を1つしか引けないのですが、これを何個も線を引くようにするにはどうすればいいか教えてください! mport java.awt.*; import java.awt.event.*; import javax.swing.*; public class Challnege13 extends JApplet { private static final long serialVersionUID = 1L; int Px=0,Py=0; // 直前の位置。 int Cx,Cy; // 現在の位置。 JPanel p; // initメソッドの定義。 public void init() { // アプレットからコンテンツペインを取得。 Container c = this.getContentPane(); // コンテンツペインのレイアウトマネージャをBorderLayoutに設定。 c.setLayout(new BorderLayout()); // パネルを定義(匿名クラス)。 p = new JPanel() { /** * */ private static final long serialVersionUID = 1L; public void paintComponent(Graphics g) { super.paintComponent(g); // 直線描画。 if( (Px == 0)&&(Py == 0) ) { Px = Cx; Py = Cy; } g.drawLine(Px,Py,Cx,Cy); // 直前の位置を更新。 Px = Cx; Py = Cy; } }; // コンテンツペインに追加。 c.add(p,BorderLayout.CENTER); // イベントリスナを定義(匿名クラス)。 MouseAdapter ma = new MouseAdapter() { // mouseClickedメソッドの定義。 public void mouseClicked(MouseEvent e) { Cx = e.getX(); // クリックした点のx座標を取得する。 Cy = e.getY(); // クリックした点のy座標を取得する。 p.repaint(); } }; // イベントリスナの登録。 this.addMouseListener(ma); } }

  • 【初歩的】関数について

    初心者のくせに、Pythonでプログラムを学びだしました。 すっごく初歩的な質問なんですが、 Pythonには int()という文字列を数字に変換する関数があるのですが、 a="4232"を数字に 変換するとき、 int(a)とやるみたいですが、 a.int()ではダメなんですか? 違いがわかりません。 また、一部だけ指定してやるとき、 a.int("32")とやればいいのですか? このへんで混乱しているので、 わかりやすくご教授してください。

  • AWTのアダプタとリスナの違いについて。

    はじめまして。今JAVAの勉強をしている新米SEです。早速質問なのですが、AWTのなかでアダプタとリスナってありますよね?あれは何の違いがあるんでしょうか?それぞれのソースを見ても特段違いがあるようにはみえないんですが。。。どのように使い分けするものなのでしょうか?お忙しいところ申し訳ございませんがご回答お願いいたします。

    • ベストアンサー
    • Java
  • リスナーがありません

    無償版のOracle 12cをインストールしました。 レジストリで「ORACLE_HOME」と「ORACLE_SID」の値を確認して環境変数に設定しました。 ORACLE_HOME … C:\app\ora\product\12.1.0\dbhome_2 ORACLE_SID … orcl それから下記のURLを参考にしてユーザーを作成しました。 http://replication.hatenablog.com/entry/2015/08/05/093000 作成したユーザーで接続しようとしたら下記のエラーが発生してしまいました。 conn 上記で作成したユーザー/パスワード@PDBORCL ORA-12541: TNS: リスナーがありません ネットで「tnsnames.ora」に記述するという記事を見たので下記のパス先ある「tnsnames.ora」に下記の内容を追加しました。 C:\app\ora\product\12.1.0\dbhome_2\NETWORK\ADMIN PDBORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = IPアドレス)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PDBORCL) ) ) でも結果は同じでした。 ※試しに下記のパス先に「tnsnames.ora」を設置しても同じでした。 C:\app\ora\product\12.1.0\dbhome_1\NETWORK\ADMIN 申し訳ありませんがどのようにすればいいのでしょうか。 何卒、ご教授宜しくお願いします。

  • リスナー

    FOXでやってるリスナー観てる人いますか? トビーみたいに人の心が読める能力があったら自分が相手にどう思われたかいちいちわかるわけですが あなたは今より自信喪失になってると思いますか? それよりも自意識過剰や疑心暗鬼などがなくなって今よりのびのび生きていると思いますか?