作ったクラスにイベントを追加するには?

このQ&Aのポイント
  • 作ったクラスにイベントを追加する方法について教えてください。
  • パネルを継承したクラスを作成し、その中でサブパネルのイベントを書きたいですが、どのようにすればよいでしょうか?
  • 具体的なコード例とともに説明してください。
回答を見る
  • ベストアンサー

作ったクラスにイベントを追加するには?

パネルを継承したクラスを作りました(パネルA)。 そのパネルAをメインフレームに作成しました。 作ったパネルAの上にサブパネルBを作りました。 サブパネルのイベントを書きたいのですがコードは作ったクラス内に書けないのでしょうか? 例)下記が作ったパネル継承クラスです。この中でpnlSubを作っているのです。で、このpnlSubのクリックイベントを書きたいのですが、どのようにイベントを用意すればよいのでしょう? package ### import java.awt.*; public class PanelA extends Panel{ Image im; Panel pnlSub = new Panel(); //CONSTRUCT public PanelA(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } //パネル(pnlVolume)設定 this.add(pnlVolume, null); pnlSub.setBackground(Color.red); pnlSub.setBounds(new Rectangle(5, 8, 108, 5)); } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } }

  • t-tree
  • お礼率83% (183/218)
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

>毎回ngsvxさんのご好意に甘えてしまい・・・。 そして今回も・・・ご回答ありがとうございます。 全然気にしてませんから、大丈夫ですよ。 ちょっと、時間がないので、手短に書いておきます。 addMouseListenerメソッドには、引数としMouseListener インターフェースを渡します。 これは、「マウスイベントの聞き手」ということです。 これを実装したインスタンスは、マウスイベントを検知できます。 ただ、このインターフェースはメソッドの数が多いため、 全てを実装するのは面倒です(コードをたくさん書く)。 そのため、MouseAdapterというアダプタークラスを使います。 (もちろん、直接実装しても問題はありません)。 アダプタークラスというのは、インターフェースのメソッドを、全て空で実装してあるクラスなのです。 これを継承してあげれば、必要なメソッドだけを定義すればいいので楽だ、ということです。 詳しくは、参考書なりをご覧下さい。 これは、よくでてくることなので、しっかりとマスター した方がいですよ。 今日は時間がないもので、とりあえずこれで失礼します。

t-tree
質問者

お礼

毎回の事ながら、大変わかりやすいご説明ありがとうございました。 そして、教えていただいた通りちゃんとイベントが取れました!!! 多分、月曜日にも質問を出してしまうと思います。お時間があったらまたお願いします。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

よく会いますね(^^; 「直ぐに回答ほしいです」となっているので、直ぐに答えましょう。 1.マウスクリックをしたときに処理を行うクラス(この場合はPanelA)  にMouseListenerインターフェースを実装させる。   あるいは、MouseAdapterクラスを継承し必要なメソッドをオーバーライドする。   (これは無名クラスでいいでしょう) 2.マウスクリックを発生させたいコンポーネントに対し、addMouseListenerを実行する。 コンストラクタで pnlSub.addMouseListener( new MouseAdapter(){                 public void mouseClicked(MouseEvent e){                   /* イベント処理                    */                 }}); でいいと思いますよ。

t-tree
質問者

お礼

>よく会いますね(^^; ただ私が勉強不足なだけで、毎回ngsvxさんのご好意に甘えてしまい・・・。 そして今回も・・・ご回答ありがとうございます。 >MouseListenerインターフェースを実装させる。  MouseAdapterクラスを継承し必要なメソッドをオーバー ライドする。 これはどういった意味なのでしょうか? きっとngsvxさんが書いてくださったロジックを素直に書けばよいのだとは思いますが、理解しとかないと同じような質問をまたしてしまいそうで・・・ ngsvxの書いてくださったコンストラクタでのロジックが言わんとされていることでしょうか?

関連するQ&A

  • なぜエラーになるのかがわかりません?(長文です。)

    下記のクラス(Panel_Middle)内でパネル(pnlFd)を作成してます。しかし、メインフォームからこのクラスの"CreateMainPanel"関数を呼ぶと "pnlFd.setBounds(new Rectangle(5, 5, 110, 38));" の後に"java.lang.NullPointerException "とエラーが出ます。色々考えたのですが、理由がわかりません。 public class Panel_Middle extends Panel{ Panel_Main pnlFd = new Panel_Main("A.gif","B.gif"); Image im; //CONSTRUCT public Panel_Middle(String img) { im = Toolkit.getDefaultToolkit().getImage(img); //MediaTracker画像入力監視 MediaTracker mt = new MediaTracker(this); mt.addImage(im, 0); try { mt.waitForID(0); } catch (InterruptedException e) { } } //Print public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("ng"); } } public void CreateMainPanel(){   this.add(pnlFd, null); pnlFd.setBounds(new Rectangle(5, 5, 110, 38)); pnlFd.setImageInit(); } }

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

    javaでプログラムを書くときにMediaTracker mt = new MediaTracker(this);とToolkit tk = Toolkit.getDefaultToolkit();の記述は書かなければならない決まりのようなものなのでしょうか?

    • ベストアンサー
    • Java
  • 画像読み込みのエラー処理

    画像を表示するアプレットのソースです。 ファイル名はstrで設定します。 Image img; String str; str = "xx.jpg"; img = getImage(getDocumentBase(), str); if (img.equals(null)) { mydbg("001"); } else { mydbg("002"); } //strがでたらめで、そのパスの画像が存在しなくても //getImage()は成功するんですか?実験してみるとそのようでした。 //その画像が存在しない場合、この下のソースでmydbg("003");が //実行されるはずなのに実行されません。 //画像が存在しない場合のエラー処理のよいソースを教えてください。 MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); try { mt.waitForID(0); repaint(); } catch (Exception e) { mydbg("003"); }

    • ベストアンサー
    • Java
  • パネルの絵の差し替え方法

    JBuilderでJavaの開発を勉強しています。 パネルがクリックされるたびに、パネルに張られている絵を差し替えたいのですが最初の2回のクリックではパネルの絵が消えてしまい3回目からのクリックでは問題なく絵は切り替わります。下記のロジックで問題があるのでしょうか? メインフレームのパネルクリックイベントから"public void ChangeImage(int num)"関数を呼びます。 ************************************************* public class New_Panel extends Panel { Image img; Image im_off; Image im_on; //CONSTRUCT public Panel_FD() { im_off = Toolkit.getDefaultToolkit().getImage("OFF.jpg"); im_on = Toolkit.getDefaultToolkit().getImage("ON.jpg");   //初期イメージ img = Toolkit.getDefaultToolkit().getImage("ON.jpg"); } public void paint(Graphics g){ g.drawImage(img, 0, 0, this); } //イメージ変更 public void ChangeImage(int num){ Graphics g; img.flush(); img = this.createImage(100, 40); if (sw == 0) { g = img.getGraphics(); g.drawImage(im_off, 0, 0, this); } else { g = img.getGraphics(); g.drawImage(im_on, 0, 0, this); } //再描画 repaint(); } } *************************************************

    • ベストアンサー
    • Java
  • 画像がうまく表示されません

    下のプログラムを実行すると、 最初の読みこみはうまくいくのですが、(一部出なくなる画像がありますが…) Internet Explorerの更新ボタンを押した時、 (1)の部分で止まってしまうようで、画像が表示されなくなります。 (ローカルドライブで実行した場合はうまく表示できるのですが、ネットワークで実行した場合にこのようになってしまいます) import java.applet.Applet; import java.awt.*; public class met extends Applet{ Image img[] = new Image[6]; MediaTracker mt; public void init(){ mt = new MediaTracker(this); for(int i = 0;i < 6;i++){ img[i] = getImage(getCodeBase(),i+".gif"); mt.addImage(img[i],0); } try{ mt.waitForID(0); }catch(InterruptedException e){} } public void paint(Graphics g){ // (1) if(!mt.checkID(0)){ g.clearRect(0,0,500,500); g.drawString("読み込み中",200,240); return; } g.setColor(Color.white); g.fillRect(0,0,500,500); for(int i = 0;i < 6;i++){ g.drawImage(img[i],i*50,0,this); } } }

    • ベストアンサー
    • Java
  • Image を90度回転して、新しいImageを作成するには?

    Image データがあったとして、それを90度回転させた別のImageを作成したいのですが、すごく時間がかかります。 もっといいやり方があると思うのですが、ネットで調べても方法が見つかりませんでした。 今採用しているのは下記のようなやり方です。 もっと短時間でImage作成できる、良い方法をご教授頂けないでしょうか? PixelGrabber pg_f = new PixelGrabber(oldimg, 0, 0, oldw, oldh, old_pixel, 0, oldw); try{ pg_f.grabPixels(); } catch (InterruptedException e){ return null; } int trans = ~0x00000000; for (int x = 0; x < oldw; x++) { for (int y = 0; y < oldh; y++) { new_pixel[y + (newh - x - 1) * neww] = old_pixel[x + oldw * y] & trans; } } Image new_img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(neww, newh, new_pixel, 0, neww)); MediaTracker mediaTracker = new MediaTracker(frame); mediaTracker.addImage(new_img, 0); try { mediaTracker.waitForID(0); } catch (InterruptedException ie) { System.err.println(ie); System.exit(1); }

  • イメージのリサイズが表示されない

    JAVA初心者です、宜しくお願い致します。 イメージをリサイズするコードを書きましたが、うまく表示されません。 コードにはエラーは出ていません、原因が分かりません。 ご教示宜しく致します。 ====================================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { //イメージのロードが完了するまで待機 tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double )re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

    • ベストアンサー
    • Java
  • 画像の縮小のプログラムのエラーについて教えて下さい

     java初心者です、宜しくお願いします。  画像の縮小のプログラムを色々と他のサンプルコードとかを参考にしながら 書きましたが、黒い四角形がWindowに表示されるだけです。  プログラム自体のエラーは表示されません。  一体どこが悪いのでしょうか、宜しくお願いします。 ===================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { // tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double ) re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

    • ベストアンサー
    • Java
  • 画像がうまく表示されない。

    アプレットを作っています。 左クリックすると、次の画像へ進む、といった処理を実装したのですが、1回は次の画像へ進むのですが、2回目以降が進みません(しかも、「1.jpg」から「2.jpg」へ進めたいのですが、何故か「1.jpg」から「10.jpg」にいってしまいます。)以下が現在のコードです。 余分な部分は削除しました。よろしくお願いします。 public class Main extends Applet implements MouseListener, Runnable{ Image nowImage, nextImage; static int i; MediaTracker mt = new MediaTracker(this); MediaTracker mt2 = new MediaTracker(this); int yousosu,w,h; Thread thread; static float alpha; static boolean runflag = true; static boolean flag = true; static int j = 1; Image buf; Graphics ct; int sleeptime = 300; Image img; Vector imgs = new Vector(); public void init(){ i = 0; thread = new Thread(this); yousosu = Integer.parseInt(getParameter("NumImage"));//配列(画像)の要素数 for(int t = 0; t < yousosu; t++){ img = getImage(getDocumentBase(),"imagesyukusyo/" + t+1 + ".JPG"); imgs.addElement(img); img = null; } int kazu = imgs.size(); addMouseListener(this); w = getSize().width; h = getSize().height; buf = createImage(w,h);//バッファ取得 //*******最初の画像のロード******* nowImage = getImage(getDocumentBase(), "imagesyukusyo/1.JPG");//←Vectorの[0]要素? } public void update(Graphics g){ paint(g); } public void paint(Graphics g){//drawImageファイルを表示するだけ ct = buf.getGraphics(); Graphics2D ct2 = (Graphics2D) ct; Graphics2D g2 = (Graphics2D) g;//Grahics2Dクラス AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha); mt.addImage(nowImage,0); mt2.addImage(nextImage, 0); try { mt.waitForID(0); mt2.waitForID(0); } catch (InterruptedException e) { e.printStackTrace(); } ct2.drawImage(nowImage,0,0,w,h,this); ct2.setComposite(composite); //次からはcompositeを設定した後の描画になる。 ct2.drawImage(nextImage,0,0,w,h,this); g2.drawImage(buf,0,0,w,h,this); } //*********マウスイベント************ public void mouseClicked(MouseEvent e) { int btn = e.getButton(); //*******左クリック********** if(btn == MouseEvent.BUTTON1){//左クリック=進め System.out.println("左クリック"); System.out.println("iは"+i); System.out.println("elementAtの数は"+imgs.size()); if(i >= yousosu){//要素数より多くなったら… i = 0; } nowImage = (Image)imgs.elementAt(i); if(i == yousosu-1){ nextImage = (Image) imgs.elementAt(0); }else{ //通常こっち nextImage = (Image) imgs.elementAt(i+1); } thread = new Thread(this); thread.start(); thread = null; i++; } } public void run(){ alpha = 0.2f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.3f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.4f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.5f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.6f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.7f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.8f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 0.9f; repaint(); try { thread.sleep(sleeptime); } catch (InterruptedException e) { e.printStackTrace(); } alpha = 1f; repaint(); } }

    • ベストアンサー
    • Java
  • アプレットに画像が表示されません

     今晩は、java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、画像がアプレットに表示されません。  画像はeclipseで同じプロジェクト(フォルダ)内に置いています。  文法上のエラーは出ておりません。  原因がわかりません宜しくお願いします。 ============================ public class Test extends Applet { MediaTracker tracker ; Image img ; public void init() {   tracker = new MediaTracker( this ) ; img = getImage( getDocumentBase() , "a.jpg" ) ; tracker.addImage( img , 0 ) ; } public void start() {              try { tracker.waitForAll(); } catch (InterruptedException e) { } } public void paint( )      { Graphics g2 = getGraphics(); g2.drawImage( img , 0 , 0 , 50 , 50 , this ) ; } }

    • ベストアンサー
    • Java