- ベストアンサー
アプレットでマウスイベントが出ない
クリックしても反応しません。 また、マウスイベントが発生したときに飛ぶメソッドに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です
- みんなの回答 (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); 無い場合は、点が残ります。
その他の回答 (2)
NullPointerExceptionの件はどうも未だに修正されていないJREのバグのようです。 バグの内容としては「×」をクリックしてウインドウを閉じようとした際に発生する旨が記載されていますが、事象としては違いますか? おそらく原因は同じだと思うのですが・・・
お礼
確かに消すときに起きます。 バグだったんですね。ありがとうございます。
このアプレットでマウスのイベントを拾いたい場合 アプレットに対してaddMouseListenerメソッドを呼び出し、 どのマウスリスナーを使用するのか決定する必要があります。 実装方法は参考URLをご覧ください。 エラーの件はちょっとこれだけだとわかりません。 >マウスイベントが発生したときに飛ぶメソッド 具体的にどのメソッドでどういったロジックになっているか記載頂ければ何かわかるかもしれません。
お礼
public void init(){ addMouseListener(this); } これが足りなかったんですね。ありがとうございます。 イベントはmouseEnteredやmouseExitedなど全部で起きてると思ったんですが。どうもSystem.out.printlnは関係ないようです。 起こりにくいので謎です。
お礼
そういう仕組みになっていたんですね。 ありがとうございます。