-1

画面をクリックするとミッキーマウスの顔が表示されるアプレットを作成しています。現在、顔をクリックすると画像全体をドラッグできるようにするコードを作成しています。Mickey は、face、leftEar、rightEar の 3 つの FilledOval オブジェクトで構成されています。プログラムを実行するたびにエラーが発生しますが、アプレットは実際には正常に動作します。エラーは次のとおりです。

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
        at Mickey.onMousePress(Mickey.java:73)
        at objectdraw.WindowControllerListener.mousePressed(WindowController.java:200)
        at java.awt.Component.processMouseEvent(Component.java:6502)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
        at java.awt.Component.processEvent(Component.java:6270)
        at java.awt.Container.processEvent(Container.java:2229)
        at java.awt.Component.dispatchEventImpl(Component.java:4861)
        at java.awt.Container.dispatchEventImpl(Container.java:2287)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
        at java.awt.Container.dispatchEventImpl(Container.java:2273)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
        at java.awt.EventQueue.access$000(EventQueue.java:101)
        at java.awt.EventQueue$3.run(EventQueue.java:666)
        at java.awt.EventQueue$3.run(EventQueue.java:664)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
        at java.awt.EventQueue$4.run(EventQueue.java:680)
        at java.awt.EventQueue$4.run(EventQueue.java:678)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

エラーは、onMousePress メソッドがある 73 行目から始まります。これが私のコードです:

import objectdraw.*;
import java.awt.*;

public class Mickey extends WindowController
{
  private static final int INSTR1_X = 50;
  private static final int INSTR1_Y = 50;
  private static final int INSTR2_X = INSTR1_X;
  private static final int INSTR2_Y = INSTR1_Y + 20;
  private static final int FACE_RADIUS = 50;
  private static final int EAR_RADIUS = 30;
  private static final int EAR_OFFSET = 50; // Center of each ear is this offset
                                            // up and over (x and y) from center
                                            // of face.
  private static double X_POS = 0;
  private static double Y_POS = 0;
  private Text instrOne, instrTwo;
  private FilledOval face, leftEar, rightEar;
  private Location mousePoint, difference;

  private static boolean isClicked = false;
  private static boolean isOver = false;

  public void begin()
  {
    instrOne =  new Text( "Click to display a Mickey silhouette " +
                          "centered at the mouse click",
                          INSTR1_X, INSTR1_Y, canvas );
    instrTwo = new Text( "Mouse press in any part of the image and " +
                         "drag to move image around.",
                         INSTR2_X, INSTR2_Y, canvas );
  }

  public void onMouseClick( Location point )
  {
    if ( !isClicked )
    {
      X_POS = ( point.getX() - (FACE_RADIUS / 2) );
      Y_POS = ( point.getY() - (FACE_RADIUS / 2) );
      mousePoint = new Location ( X_POS, Y_POS );
      instrOne.hide();
      instrTwo.hide();
      face = new FilledOval( mousePoint, FACE_RADIUS, FACE_RADIUS, canvas);
      leftEar = new FilledOval( (X_POS - (EAR_RADIUS / 2)),
                                (Y_POS - (EAR_RADIUS / 2)),
                                EAR_RADIUS, EAR_RADIUS, canvas );

      rightEar = new FilledOval((X_POS + (EAR_OFFSET - (EAR_RADIUS / 2))) ,
                                (Y_POS - (EAR_RADIUS / 2)),
                                EAR_RADIUS, EAR_RADIUS, canvas );
      isClicked = true;
    }
  }

  public void onMousePress ( Location point )
  {
    if (face.contains ( point ) ||
        leftEar.contains ( point ) ||
        rightEar.contains ( point ) )
    {
      isOver = true;
    }
  }

  public void onMouseRelease ( Location point )
  {
    isOver = false;
  }

  public void onMouseDrag ( Location point )
  {
    if ( isOver )
    {
      X_POS = ( point.getX() - (FACE_RADIUS / 2) );
      Y_POS = ( point.getY() - (FACE_RADIUS / 2) );
      face.moveTo( X_POS, Y_POS );
      leftEar.moveTo( (X_POS - (EAR_RADIUS / 2)),
                      (Y_POS - (EAR_RADIUS / 2)) );
      rightEar.moveTo( (X_POS + (EAR_OFFSET - (EAR_RADIUS / 2))),
                       (Y_POS - (EAR_RADIUS / 2)) );
    }
  }

  public void main ( String[] args )
  {
    Mickey current = new Mickey();
    current.begin();
  }
}
4

2 に答える 2

1

onMousePressマウスボタンが押されたときに呼び出されます。faceまだ初期化されていないを使用しようとしています。faceは で初期化されonMouseClick、マウスがクリックされたときに呼び出されます。これは「マウスボタンを押して離す」という意味です。face初期化前に (または任意のフィールド) を使用できないため、 NullPointerException. このコードを移動してみてください

face = new FilledOval( mousePoint, FACE_RADIUS, FACE_RADIUS, canvas);
leftEar = new FilledOval( (X_POS - (EAR_RADIUS / 2)),
                          (Y_POS - (EAR_RADIUS / 2)),
                          EAR_RADIUS, EAR_RADIUS, canvas );
rightEar = new FilledOval((X_POS + (EAR_OFFSET - (EAR_RADIUS / 2))) ,
                          (Y_POS - (EAR_RADIUS / 2)),
                          EAR_RADIUS, EAR_RADIUS, canvas );

onMousePress省略記号が必要なとき (それらを使用するコードの前) に呼び出されるメソッドに。

于 2013-10-07T18:05:32.957 に答える
0

mousePressed は mouseClicked の前に発生するため、 face 変数は ではonMousePressedなくで初期化する必要がありますonMouseClicked

mousePressed :コンポーネント上でマウスボタンが押されたときに呼び出されます

mouseClicked : コンポーネント上でマウスボタンがクリックされた (押して離された) ときに呼び出されます。

于 2013-10-07T18:04:21.310 に答える