• ベストアンサー

アプレットでマウスイベントが出ない

クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドにSystem.out.printlnを入れるとException in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pDataが出ることがあります。 import java.applet.Applet; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class NewJApplet extends javax.swing.JApplet implements MouseListener{ int x = 10; int y = 10; public void init() { x = 50; y = 50; } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed( MouseEvent e ){ x = e.getX(); // マウスがクリックされた位置のx座標を取得する y = e.getY(); // マウスがクリックされた位置のy座標を取得する repaint(); // アプレットの再描画を指示する } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.fillOval(x,y,10,10); } } 使ってるのは jre1.6.0_01 NetBeans 5.5です

noname#51262
noname#51262
  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.3

ソース -------------------------------------------------------------------------- import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class NewJApplet extends javax.swing.JApplet implements MouseListener{ int x = 10; int y = 10; public void init() { x = 50; y = 50; //自分のマウスイベントに反応するよう登録 this.addMouseListener(this); //実際に見える背景を白色に設定(無くても問題ありません) this.getContentPane().setBackground(Color.WHITE); } public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mousePressed( MouseEvent e ){ x = e.getX(); // マウスがクリックされた位置のx座標を取得する y = e.getY(); // マウスがクリックされた位置のy座標を取得する repaint(); // アプレットの再描画を指示する } public void mouseReleased(MouseEvent e){ } public void paint(Graphics g) { //元々の処理を親にお願いします。 super.paint(g); g.fillOval(x,y,10,10); } } -------------------------------------------------------------------------- イベントについて イベントでは、2つの処理で構成されています。 イベントを受信して告知するクラス(発行役)と、 報告を受けたら作業をするクラス(受取役)です。 その1 ●JApplet内でマウスのイベント処理をしたい場合 元々、JAppletは、マウスのイベント告知をする機能(発行役)を持っています。 でも、作業する機能(受取役)は無いので、受取役のMouseListenerをくっつけます。 これより、mousePressed()などのメソッドが、出来ます。 でも、これで完成ではありません。 発行役に受取役を設定する必要があります。 this.addMouseListener(this); この場合、発行も受取も同じJAppletなのでこのようになります。 this.addMouseListener(button); this.addMouseListener(label); などと、別のクラスを追加する事も可能です。 JAppletでマウスが動いた際に、 登録しているボタンやラベルのクラス内のmousePressedで処理を行う事ができます。 大切なのは、イベントを登録する事です。 その2 元々paint()メソッドは、パネル全体を描画しますが、 g.fillOval(x,y,10,10);の処理の為、paintメソッドを書き直した状態になります。 その為、親で行っていた、再描画をしてくれなくなりました。 親にお願いする必要があります。 super.paint(g); 無い場合は、点が残ります。

noname#51262
質問者

お礼

そういう仕組みになっていたんですね。 ありがとうございます。

その他の回答 (2)

noname#33813
noname#33813
回答No.2

NullPointerExceptionの件はどうも未だに修正されていないJREのバグのようです。 バグの内容としては「×」をクリックしてウインドウを閉じようとした際に発生する旨が記載されていますが、事象としては違いますか? おそらく原因は同じだと思うのですが・・・

参考URL:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5062191
noname#51262
質問者

お礼

確かに消すときに起きます。 バグだったんですね。ありがとうございます。

noname#33813
noname#33813
回答No.1

このアプレットでマウスのイベントを拾いたい場合 アプレットに対してaddMouseListenerメソッドを呼び出し、 どのマウスリスナーを使用するのか決定する必要があります。 実装方法は参考URLをご覧ください。 エラーの件はちょっとこれだけだとわかりません。 >マウスイベントが発生したときに飛ぶメソッド 具体的にどのメソッドでどういったロジックになっているか記載頂ければ何かわかるかもしれません。

参考URL:
http://wisdom.sakura.ne.jp/system/java/awt/Gjava16.html
noname#51262
質問者

お礼

public void init(){ addMouseListener(this); } これが足りなかったんですね。ありがとうございます。 イベントはmouseEnteredやmouseExitedなど全部で起きてると思ったんですが。どうもSystem.out.printlnは関係ないようです。 起こりにくいので謎です。

関連するQ&A

  • java リアルタイムでマウスの座標を取得したい

    マウスのリアルタイム座標を取得したいのですが、 以下のソースを作りました。 しかし、リアルタイムどころか、マウスをクリックしても座標が取得できません どこを修正すればいいのでしょうか? import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.awt.event.MouseEvent; import java.net.URL; import java.awt.Image; /*<applet code="applet001" width="640" height="480"></applet>*/ public class applet001 extends Applet implements MouseListener, MouseMotionListener { Dimension dim; int mouse_x, mouse_y; //アプレットの初期化時呼び出される public void init() { dim = getSize(); addMouseListener( this ); } public void update(Graphics g) //オーバーライドして最低限のことだけをする { paint(g); } public void paint(Graphics g) { g.drawString( "マウス:" + mouse_x + "," + mouse_y, 60, 120 ); g.fillOval(mouse_x,mouse_y,30,30); } // マウスの処理 public void mousePressed( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); } public void mouseClicked( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} public void mouseEntered( MouseEvent e ) {} public void mouseDragged( MouseEvent e ) {} // public void mouseExited( MouseEvent e ) {} // public void mouseMoved( MouseEvent e ) { mouse_x = e.getX(); mouse_y = e.getY(); repaint(); } }

    • ベストアンサー
    • Java
  • 【アプレット】マウスイベントについて

    【アプレット】マウスイベントについて 現在、マウスに円をリンクさせています 1回左クリックするとその場所で円が停止し、もう1回左クリックするとまた動きだし、もう1回左クリックするとその場所で円が停止し、・・・の繰り返しを行いたいです なにかアドバイスをください。 作ってるのに近いプログラム ↓ import java.applet.* ; import java.awt.*; import java.awt.event.*; public class test extends Applet { int posX = 50; int posY = 50; public void paint(Graphics g) { g.setColor(Color.red); g.fillOval(posX, posY, 50, 50); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void init () { this.setSize(200, 200); this.setVisible(true); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { posX = e.getX(); posY = e.getY(); repaint(); } public void mousePressed( MouseEvent e ){ x = e.getX(); y = e.getY(); repaint(); } public void mouseReleased(MouseEvent e){ } public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }); } }

  • Javaのアプレットについて質問です。

    星型の図形をアプレットビューワ上でマウスを押した場所に移動させたいのですが・・・ import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; import java.awt.Polygon; public class Enshu1_5 extends Applet implements MouseListener { int px []={100,80,10,70,40,100,160,130,190,120}; int py []={10,75,75,113,190,140,190,113,75,75}; private Polygon poly = new Polygon(px,py,10 ); public void init() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { g.setColor(Color.red); g.fillPolygon(poly); g.setFont(new Font("serif",Font.BOLD,24)); g.drawString("Star",100,200); } } こんな感じでつくってみたのですが現在位置とクリック位置との差分割り出し方をpublic void mouseClicked(MouseEvent e)の所に書きたいのですが普通にpoly.translate( e.getX(), e.getY() );をしてしまうと原点からの移動になってしまうため、フィールド上にint x=0,y=0をつくりmouseClickedのところで if(e.getX()>x&&e.getY()>y) { int dx=e.getX()-x; int dy=e.getY()-y; x=dx; y=dy; poly.translate(dx,dy); repaint(); }の様な感じで考えられる条件を条件分岐していこうと思ったのですがどうもうまくいきませんしかなりかさばったものになってしまうと思います。何かいい方法はないでしょうか? 教えて下さい><

    • ベストアンサー
    • Java
  • AWTの質問

    以下のようなコードを書きました。円の中をクリックすると赤色に塗りつぶしたいようにしたいのですが、現状だとどこをクリックしても赤色に塗りつぶされます。(クリックした座標が円の範囲にあれば。。)というような処理を付け加えたいのですが手順がわかりません。コードで示してもらえると助かります。 import java.applet.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class En extends Applet implements MouseListener{ public void init() { this.addMouseListener(this); } public void paint(Graphics g) { g.fillOval(20, 25, 500, 400); } public void mouseClicked(MouseEvent e) { Graphics g = getGraphics(); g.setColor(Color.red); //ここに何か書くべきと思われる g.fillOval(20, 25, 500, 400); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }

    • ベストアンサー
    • Java
  • マウスイベント処理

    描いた図形(今の場合は長方形)をドラッグして移動させるプログラムを作りたいのですが、うまくいきません… アドバイスどうかよろしくお願いします。 あと、どうすればマウスイベントを使ったプログラム作成が苦手じゃなくなるのでしょうか。 重ねてアドバイスお願い致します。 以下が私が作ったプログラムです。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class RectMove extends Applet implements MouseListener, MouseMotionListener{ Rectangle r1 = new Rectangle(10, 10, 50, 40); Point p1,p2; public void init(){ addMouseListener(this); addMouseMotionListener(this); } public void paint(Graphics g){ g.drawRect(r1.x, r1.y, r1.width, r1.height); } public void mousePressed(MouseEvent e){ p1 = e.getPoint(); if(!r1.contains(p1)) p1 = null; } public void mouseReleased(MouseEvent e){ if(p1 != null){ p2 = e.getPoint(); r1.translate((p2.x - p1.x), (p2.y - p1.y)); p1 = null; repaint(); } } public void mouseClicked(MouseEvent e){ p1 = null; repaint(); } public void mouseDragged(MouseEvent e){ if(p1 != null){ p2 = e.getPoint(); r1.translate((p2.x - p1.x), (p2.y - p1.x)); p1.setLocation(p2); repaint(); } } public void mouseMoved(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} }

    • ベストアンサー
    • Java
  • javaアプレットの課題について

    大学の授業の課題についてなんですが、 javaアプレットを使って 「徐々に大きな四角形を表示させ、ある程度の大きさの四角形になったらまた最初に戻り、さらにボタンを表示させ、ボタンを押す度に四角形の拡大をストップ、スタートさせるプログラムを作れ。また、マウスでクリックした部分を中心に、徐々に大きな四角形を表示させるようにもするように。」 という、自分でも書いていて分からなくなりそうな内容の課題が出されまして、先生などのアドバイスを頼りに import java.applet; import java.awt.Graphics; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.Color; import java.awt.Button; public class Report1 extends Applet implements ActionListener,Runnable { int x = 10; int y = 10; Button bt; public void init() { addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { x = e.getX(); y = e.getY(); repaint(); } }); { bt.setLabel("pause"); } while{ } if() repaint(); public void paint(Graphics g) { g.setColor(Color, white); g.fillRect(0, 0, 400, 400); } public void update(Graphics g){ paint(); 何とか上のような感じにまではこぎつけたのですが、 ここからは正直どうすればいいのか検討がつかず お手上げ状態なんです... どなたか解答又は参考になるサイトがあれば 教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのイベント処理についての質問

    今、以下の課題に取り組んでいるのですが、「新しくクリックした座標点で円を描くだけでなく、 以前にクリックした座標点での円も全て表示するように」というところのプログラミング方法がわかりません。 現在のソースは実行してもクリックしたところに円が表示されるようにできたのですが、別の場所をクリックすると以前の円は消えてしまいます。 どなたか詳しい方教えていただけませんでしょうか。 問題文↓ 図のように、マウスクリックした位置に円を描くアプレットを作成せよ。円の数は最大10個までとする。なおマウスクリックした位置は、 public void mouseClicked(MouseEvent e) とすると e.getX(); e.getY(); というメソッドでint型のx,y座標点として得られる。 クリックした座標点を記憶しておくために、点の位置は、xp[i]、yp[i]のように配列を使用し、新しくクリックした座標点で円を描くだけでなく、 以前にクリックした座標点での円も全て表示するように、プログラムを作成すること。 なお、メソッドmouseClicked(MouseEvent e)とメソッドpaint(Graphics g)に共通して座標点を扱うために座標点はグローバル宣言を必要とする。 ソース import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Marble extends Applet { int xp; int yp; public void init(){ MsListener mouseListener=new MsListener(); setBackground(Color.white); addMouseListener(mouseListener); } class MsListener extends MouseAdapter{ public void mouseClicked(MouseEvent e){ xp=e.getX(); yp=e.getY(); repaint(); } } public void paint(Graphics g){ final int MAX=20,WIDTH=200,HEIGHT=200; g.draw3DRect(0,0,WIDTH-2,HEIGHT-2,false); g.setColor(Color.blue); g.fillOval(xp-5,yp-5,10,10); } } どうかよろしくお願いします。

  • JAVAのアプレットのアニメーションの質問

    javaのアプレットに関する質問なんですが、今次の条件でアニメーションを作っているんですが、どうしても解決できない問題があります。 赤い長方形が左から右に動いていくプログラムを作成する。 ・ 長方形が描画領域 の右端に消えると左端から再 度出現するようにせよ。 ・ Reverseと書かれたボタンを押すと長方形の進行方 向が左右反対になる。 ・ このとき、左右どちらの端に長方形が消えた場合も 反対端から長方形は出現する。 ・ 長方形をクリック(ボタン押下)すると長方形の色が 変化する。 ・ 赤い長方形であれば青に、青い長方形であれば赤 に変化する。 この条件でつくろうと思っているのですが、長方形をクリックしたときに、色の変化がどうしてもできません。どこに問題があるか分かりません。御教授お願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; import java.awt.Font; import java.awt.Button; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.MouseListener; public class Report2 extends Applet implements Runnable,ActionListener,MouseListener{ int x=100; int y=50; int width=80; int height=120; int dir=-2; int w; int z; Button bt; boolean direction; boolean colorRed; public void actionPerformed(ActionEvent ae){ if(direction==true){ direction=false; } else{ direction=true; } } public void init(){ bt=new Button("Reverse"); add(bt); bt.addActionListener(this); Thread th; th =new Thread(this); th.start(); addMouseListener(this); } public void mouseClicked(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mousePressed(MouseEvent e){ w=e.getX(); z=e.getY(); repaint(); if(e.getX()>=x && e.getX()<=x+width && e.getY()>=y && e.getY()<=y+height){ colorRed=!colorRed; } } public void run() { while(true){ x++; if(x==400){ x=-80; } if(direction==true){ x=x+dir; } else{ } repaint(); try{ Thread.sleep(30); } catch(InterruptedException e){} } } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,400,200); g.setColor(Color.red); g.fillRect(x,y,80,120); if(colorRed=true){ g.setColor(Color.red); } if(colorRed=false){ g.setColor(Color.blue); } g.fillRect(x,y,width,height); g.setColor(Color.black); g.fillRect(x,y,10,10); } }

    • ベストアンサー
    • Java
  • マウスのイベントが働かない。

    javaを学習している者です。外枠の中がクリックされたら分かるようにマウスのイベントを実装したく、以下のように実装したのですが、どうやらクリックしたのに対して応答(System.out.println("clicked");)しないのですが、どこか間違っているでしょうか? よろしくお願いします。 import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JPanel; public class MainPanel extends JPanel implements MouseListener{ int masu = 40;//マスの一辺の長さ int hajimex = 50;//マスの始まりの左端の座標 int hajimey = 35; int masuflag[][] = new int[9][9]; public MainPanel(){ super(); setLayout(null); System.out.println("hajimeri"); } public void paintComponent(Graphics g){ g.setColor(Color.black); //******マス達を描く******** //まずは縦線 for(int i = 0; i < 10; i++){ g.drawLine(hajimex+i*masu,hajimey,hajimex+i*masu,hajimey+masu*9); } //そして横線 for(int i = 0; i < 10; i++){ g.drawLine(hajimex,hajimey+i*masu,hajimex+masu*9,hajimey+i*masu); } //太線(縦) g.drawLine(hajimex+3*masu-1,hajimey,hajimex+3*masu-1,hajimey+masu*9); g.drawLine(hajimex+6*masu-1,hajimey,hajimex+6*masu-1,hajimey+masu*9); //太線(横) g.drawLine(hajimex,hajimey+3*masu-1,hajimex+masu*9,hajimey+3*masu-1); g.drawLine(hajimex,hajimey+6*masu-1,hajimex+masu*9,hajimey+6*masu-1); } public void mouseClicked(MouseEvent e){ Point point = e.getPoint(); //クリックされた場所の判定 if(point.x > hajimex && point.x < hajimex+masu*9){ if(point.y > hajimey && point.y < hajimey+masu*9){ //外枠より内側だった場合 System.out.println("clicked"); } } } public void mousePressed(MouseEvent arg0) { } public void mouseReleased(MouseEvent arg0) { } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } }

    • ベストアンサー
    • Java
  • マウスのイベント処理について

    「/home/tatuya/MyDocument/logo.jpg」の画像をドラック・移動できるようにしたいのですがうまくいきません。 なにがいけないのか教えてください。 できれば手直しして動くようになったプログラムをはってもらえるとさいわいです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.ImageIO; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.Graphics; import java.awt.Image; import java.awt.geom.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class bb extends JFrame{ private int px; private int py; boolean flag=false; Image icon=getToolkit().getImage("/home/tatuya/MyDocument/logo.jpg"); public static void main(String[] args){ bb frame = new bb(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 400, 250); frame.setTitle("タイトル"); frame.setVisible(true); new bb(); } public void paint(Graphics g){ g.drawImage(icon,px,py,this); } public void mouseClicked(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseEntered(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mouseExited(MouseEvent e){ /* 処理したい内容をここに記述する */ } public void mousePressed(MouseEvent e){ /* 処理したい内容をここに記述する */ if (px<=e.getX() && e.getX()<=px+221 && py<=e.getY() && e.getY()<=py+59) flag=true; repaint(); } public void mouseReleased(MouseEvent e){ /* 処理したい内容をここに記述する */ flag=false; } public void mouseDragged(MouseEvent e){ if (flag){ px=e.getX();py=e.getY(); repaint(); } } public void mouseMoved(MouseEvent e){ } }