2016-11-22 1 views
0

저는 현재 체커 타입의 게임을 만들고 있습니다. 타일을 클릭 할 때마다 타일을 위, 아래 등으로 움직일 수 있습니다. 조각을 클릭 한 다음 타일을 클릭하면 어떻게 될까요? 그것을 작동하게합니다. "gp.add (C, 행 안부);"여기검사기 조각이 JavaFX에서 원하는 타일로 이동 했습니까?

조각에 대한 이벤트 핸들러와 보드

class CircleEventHandler implements EventHandler<MouseEvent>{ 
    int Crow; 
    int Ccol; 
    @Override 
    public void handle(MouseEvent event) { 
     System.out.println("Mouse Clicked"); 

     Circle c = (Circle)event.getSource(); 
     Crow = gp.getRowIndex(c); 
     Ccol = gp.getColumnIndex(c); 
     System.out.println("row is " + Crow + " & col is " + Ccol); 

     gp.getChildren().remove(c); 


    } 

} 

class RectangleEventHandler implements EventHandler<MouseEvent>{ 

    @Override 
    public void handle(MouseEvent event) { 

     Rectangle r = (Rectangle)event.getSource(); 
     int row = gp.getRowIndex(r); 
     int col = gp.getColumnIndex(r); 
     System.out.println("row is " + row + " & col is " + col); 

     gp.add(c, row, col); 


    } 

} 

나에게 널 포인터 예외를 얻고 나를 가리 킵니다이 코드를 실행은 사각형 이벤트 핸들러에서. 나는이 일을하는 법을 누군가가 올바른 방향으로 나를 가리킬 수 있을지 모르겠다.

+0

gp.getChildren()'.add ('c' .... 참고 : 'c'는 두 번째 이벤트에서 정의되지 않았습니다. IDE가이 항목을 가리키고 있지 않습니까? – brian

+0

그렇지 않습니다. 안타깝게도 CircleEventHandler에서 CircleEventHandler가 어떻게 보이는지 모르겠다. – krambo

+0

이것은 정적 멤버를 역 참조하기 위해 변수를 사용하지 않아야하는 좋은 예이다 .gp.getColumnIndex (r)'make 'gp.add' 전에는'gp'가 역 참조되었다고 생각 합니다만,이 메도 드는 정적이기 때문에 그렇지 않습니다.'gp.add' 행이 "근본 원인"의 스택 트레이스에서 최상위 요소라면, 유일한 가능성은'gp'가'null'입니다. – fabian

답변

0

예 : 이러한 핸들러 클래스를 내부 클래스로 만들고 데이터를 둘러싸는 인스턴스에 저장하여이 작업을 수행하십시오.

다음 예제는 이전에 클릭 한 원 색상을 기준으로 직사각형을 다시 칠하는 방법을 보여 주지만 정보가 전달되는 방법을 보여 주어야합니다. 코드에서 NPE의 원인을 찾는으로

public class Board { 

    public Board(GridPane grid) { 
     this.grid = grid; 
    } 

    private final GridPane grid; 
    private Circle selectedCircle; 

    public class CircleEventHandler implements EventHandler<MouseEvent> { 

     @Override 
     public void handle(MouseEvent event) { 
      // store info about circle clicked in enclosing instance 
      selectedCircle = (Circle) event.getSource(); 
     } 

    } 

    public class RectangleEventHandler implements EventHandler<MouseEvent> { 

     @Override 
     public void handle(MouseEvent event) { 

      if (selectedCircle != null) { 
       // use field of enclosing instance to retrieve color of the circle 
       Rectangle r = (Rectangle) event.getSource(); 
       r.setFill(selectedCircle.getFill()); 
       selectedCircle = null; 
      } 

     } 

    } 

} 
@Override 
public void start(Stage primaryStage) { 
    GridPane root = new GridPane(); 
    root.addRow(0, new Circle(50, Color.GREEN), new Circle(50, Color.YELLOW), new Circle(50, Color.RED)); 
    root.addRow(1, new Rectangle(50, 50), new Rectangle(50, 50), new Rectangle(50, 50)); 

    Board board = new Board(root); 

    EventHandler<MouseEvent>[] handlers = new EventHandler[] { 
     board.new CircleEventHandler(), 
     board.new RectangleEventHandler() 
    }; 

    for (Node n : root.getChildren()) { 
     n.setOnMouseClicked(handlers[GridPane.getRowIndex(n)]); 
    } 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

: gp가 null의 이유에 대한 정보가 없기 때문에 이것은, 자세한 내용없이 불가능하다.

+0

fabian에게 감사드립니다. – krambo

관련 문제