JavaFx确定鼠标是在点击背景还是圆圈

时间:2016-10-09 19:37:41

标签: javafx mouseevent mouselistener

我正在创建一个游戏,其中圆圈从屏幕顶部落到底部。单击圆圈时,它会假设在屏幕顶部的随机位置重新生成并使用随机颜色。我很确定我的问题与我的行有关,以确定鼠标点击是否在其中一个圆圈上是否正常工作。所以我的问题是如何确定是否在其中一个圆圈或背景屏幕上发生鼠标点击?并且以下行有什么问题? (因为我几乎可以肯定我的问题来自那条线)

if((shape.get(i).getLayoutX() == e.getX())&&(shape.get(i).getLayoutY() == e.getY())){

我的整个代码在这里:

public class ShapesWindow extends Application{
 final int WIDTH = 640;
 final int HEIGHT = WIDTH / 12 * 9;
 Random r = new Random();
 Circle circle;
 double yCord;
 long startNanoTime;

 Group root = new Group();
 Scene scene = new Scene(root, WIDTH, HEIGHT);
 Canvas can = new Canvas(WIDTH,HEIGHT);
 GraphicsContext gc = can.getGraphicsContext2D();
 ArrayList<Shape> shape = new ArrayList<>();

 @Override
 public void start(Stage theStage) throws Exception {
     theStage.setTitle("Click the bubbles!");
     theStage.setScene(scene);
     root.getChildren().add(can);
     gc.setFill(Color.LIGHTBLUE);
     gc.fillRect(0,0,WIDTH,HEIGHT);

     /* This adds 10 circles to my Group */
     for(int i = 0; i < 10; i++){
        gc.setFill(Color.LIGHTBLUE);
        gc.fillRect(0,0,WIDTH,HEIGHT);
        circle = new Circle(15,randomColor());
        root.getChildren().add(circle);
        circle.setLayoutX(r.nextInt(WIDTH+15));
        circle.setLayoutY(0);
        shape.add(circle);
    }

    /* This my attempt at trying to handle the Mouse Events for each thing */
    for(int i = 0; i < 10; i++){
        shape.get(i).setOnMouseClicked(
                new EventHandler<MouseEvent>(){
                    public void handle(MouseEvent e){
                        shapeClicked(e);

                    }
                });
    }

    startNanoTime = System.nanoTime();
    new AnimationTimer(){
        public void handle(long currentNanoTime){
            double t = (currentNanoTime - startNanoTime) / 1000000000.0;
            yCord = t*20;

            for(int i = 0; i < 10; i++){
                /* This if statment allows nodes to wrap around from bottom to top */
                if(yCord >=HEIGHT){
                    shape.get(i).setLayoutX(r.nextInt(WIDTH+15));
                    shape.get(i).setLayoutY(0);
                    shape.get(i).setFill(randomColor());
                    resetNan();
                }

                shape.get(i).setLayoutY(yCord);
            }
        }
    }.start();
    theStage.show();
}

 /*
  * This Function is suppose the change the color and position of the  circle that was clicked
  */
 public void shapeClicked(MouseEvent e){
    for(int i = 0; i < shape.size();i++){
        if((shape.get(i).getLayoutX() == e.getX())&&(shape.get(i).getLayoutY() == e.getY())){
            shape.get(i).setLayoutX(r.nextInt(WIDTH+15));
            shape.get(i).setLayoutY(0);
            shape.get(i).setFill(randomColor());
    }
 }

 /*
  * This allows the value of startNanoTime to be indrectly change it  can not be changed diretly
  * inside of handle() inside of the Animation class
  */
 public void resetNan(){
     startNanoTime = System.nanoTime();
 }

 public Color randomColor(){
     double R = r.nextDouble();
     double G = r.nextDouble();
     double B = r.nextDouble();
     double opacity = .6;
     Color color = new Color(R, G, B, opacity);
     return color.brighter();
 }
 public static void main(String[] args){
     launch(args);
 }

}

2 个答案:

答案 0 :(得分:0)

为什么不

for(int i = 0; i < 10; i++){
    Shape s = shape.get(i);
    s.setOnMouseClicked(
            new EventHandler<MouseEvent>(){
                public void handle(MouseEvent e){
                    s.setLayoutX(r.nextInt(WIDTH+15));
                    s.setLayoutY(0);
                    s.setFill(randomColor());
                }
            });
}

答案 1 :(得分:0)

我知道已经过去了很长时间,但是如果其他任何人需要检查鼠标单击事件是否在Circle或任何其他形状上,则最好使用内置的.contains方法。感谢JavaFx几何类的Point2D,您可以检查点击(x,y坐标)是否在形状上,您不必担心点击位置:位于中心还是边框。

for (Circle circle:listOfCircles) {
                Point2D point2D = new Point2D(event.getX(),event.getY());
                if (circle.contains(point2D)){
                    System.out.println("circle clicked");
                }

            }