当前位置: 首页 > 知识库问答 >
问题:

处理两个重叠节点上的鼠标事件-Javafx

云鸿达
2023-03-14

我正在构建一个Java应用程序。这个应用程序是一个典型的“油漆”应用程序,你可以选择一种颜色,并在画布上绘制。除了...我将有一个圆圈数组分布在画布的顶部。我希望这些圆立即改变颜色,如果,当用户正在绘制和鼠标得到圆的X(10)个像素(其中X是绘制的线的宽度除以2)。

这是我的密码。我有一张画布是一组的一部分。我还创建了一个圆圈节点,并将其作为组的一部分。我想我需要以某种方式创建一个鼠标事件,当用户在每一个圆圈附近绘图时,该事件就会触发。我最终将有许多圈在画布上,但我开始只有1个测试目的。

package paintingcircles;

import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.ColorPicker;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;


public class LayerController {

    private ColorPicker colorPicker;
    private Group root;
    private Group canvasGroup;
    private Canvas canvas1;
    private GraphicsContext gc1;


    // Reference to the main application
    private MainApp mainApp;

     /**
      * Is called by the main application to give a reference back to itself.
      * 
      * @param mainApp
      */
      public void setMainApp(MainApp mainApp) {
          this.mainApp = mainApp;

          //get data from main app if necessary
      }

    public void initialize(){

        createLayers();
        handleLayers();
        createCircles();

    }

    private void createLayers(){

        canvas1 = new Canvas(400, 400);

        // Obtain Graphics Context
        gc1 = canvas1.getGraphicsContext2D();
        initDraw(gc1);

        //create root group
        Group root = new Group();

        canvasGroup = new Group(); 
        canvasGroup.getChildren().add(canvas1);


        //add nodes to the root group
        VBox vBox = new VBox(); //lays out children in a vertical box
        vBox.getChildren().addAll(colorPicker, canvasGroup);
        root.getChildren().add(vBox);
        Scene scene = new Scene(root, 400, 425);
        mainApp.getPrimaryStage().setTitle("Painting Circles");
        mainApp.getPrimaryStage().setScene(scene);
        mainApp.getPrimaryStage().show();

    }

    private void initDraw(GraphicsContext gc){

        colorPicker = new ColorPicker();

        double canvasWidth = gc.getCanvas().getWidth();
        double canvasHeight = gc.getCanvas().getHeight();

        gc.setFill(Color.LIGHTGRAY);
        gc.setStroke(Color.BLACK);
        gc.setLineWidth(10);

        gc.fill();
        gc.strokeRect(
                0,              //x of the upper left corner
                0,              //y of the upper left corner
                canvasWidth,    //width of the rectangle
                canvasHeight);  //height of the rectangle

        gc.setFill(colorPicker.getValue());
        gc.setStroke(colorPicker.getValue());
        gc.setLineWidth(1);
    }

    private void handleLayers(){

           canvas1.addEventHandler(MouseEvent.MOUSE_PRESSED, 
                   new EventHandler<MouseEvent>(){

               @Override
               public void handle(MouseEvent event) {
                   gc1.beginPath();
                   gc1.setLineWidth(20);
                   gc1.moveTo(event.getX(), event.getY());
                   gc1.setStroke(colorPicker.getValue());
                   gc1.strokeRoundRect(event.getX(), event.getY(), 10, 10, 10, 10);
               }
           });

           canvas1.addEventHandler(MouseEvent.MOUSE_DRAGGED, 
                   new EventHandler<MouseEvent>(){

               @Override
               public void handle(MouseEvent event) {

                //TODO: Smooth out the mouse_dragged drawing
                gc1.lineTo(event.getX(), event.getY());
                   gc1.setLineWidth(20);
                   gc1.setStroke(colorPicker.getValue());
                   gc1.stroke();

               }
           });

           canvas1.addEventHandler(MouseEvent.MOUSE_RELEASED, 
                   new EventHandler<MouseEvent>(){

               @Override
               public void handle(MouseEvent event) {

               }
           });

       }

    private void createCircles(){

        Circle c = new Circle();
        c.setCenterX(100.0f);
        c.setCenterY(100.0f);
        c.setRadius(25);
        c.setStrokeWidth(5);
        c.setStroke(Color.BLUE);
        c.setFill(Color.TRANSPARENT);
        canvasGroup.getChildren().add(c);

            /*This is my attempt at creating a mouse event that will trigger when 
             *the user drags the mouse near the circle with the idea that it will
             *eventually color the circle. This didn't work...
             */
        c.addEventHandler(MouseEvent.ANY, new EventHandler<MouseEvent>(){

               @Override
               public void handle(MouseEvent event) {
                   gc1.setLineWidth(20);
                   gc1.setStroke(Color.GREEN);
                   gc1.strokeRoundRect(event.getX(), event.getY(), 10, 10, 10, 10);
               }

           });

    }

} 

共有1个答案

暴奕
2023-03-14

我想我想明白了...我需要在调用“startFullDrag()”之后捕获“mouse_drag_over”事件。

canvas1.addEventHandler(MouseEvent.DRAG_DETECTED, 
           new EventHandler<MouseEvent>(){

       @Override
       public void handle(MouseEvent event) {
           canvas1.startFullDrag();       
       }
   });

c.addEventHandler(MouseDragEvent.MOUSE_DRAG_OVER, new EventHandler<MouseDragEvent>(){

       @Override
       public void handle(MouseDragEvent event) {
           c.setFill(colorPicker.getValue());   
       }
   });
 类似资料:
  • 因此,我有一个#container div的简单设置,其中包含一个#field div。我还有一个不可见的#悬停范围,它跟随鼠标移动(居中)并在#field上悬停时可见。 HTML: JS公司: 当我在场地上悬停时,只要我移动鼠标,它就会触发无数的mouseenter和mouseleave(预期的mousemove)事件。这似乎是因为#悬停范围以鼠标为中心,每次移动鼠标时,我都会离开#字段并输入#

  • 目标 学习在OpenCV中处理鼠标事件 你将学习这些函数:cv2.setMouseCallback() 简单的演示 在这里,我们创建一个简单的应用程序,无论我们在哪里双击它,都会在图像上绘制一个圆圈。 首先我们创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的东西,例如左键,左键,左键双击等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。

  • 我准备好为此拔掉头发了。我正在开发游戏图形用户界面,它有一个由网格单元组成的地图。 单元格网格由StackPane组成,然后由ImageView或Shapes等组成的几个层组成。 整个内容包含在GridPane中,GridPane包含BorderPane的中心元素; 我不能在底层场景中添加鼠标事件,因为所有节点都会得到它- 下面是创建堆栈的代码: 这是设置EventHandler的代码- 谢谢你的

  • 我要在两个图像视图之间绘制路径,视图与图片相同 此路径从其中一个imageview开始(按鼠标),继续(按鼠标)并在窗格上移动事件,并且必须在另一个imageview结束(按鼠标)。这是第一次鼠标按下在imageviews上没有收到任何鼠标按下事件后的问题,该事件只是在窗格上收到,因为绘制线没有停止。我的代码出了什么问题? 这是我的控制器代码: 请帮帮我。

  • 我有一个定义如下的WPF TreeView控件: 我使用以下代码跟踪哪些节点已经展开或折叠: 与以下代码的工作方式不同: 在第一种情况下,根本不执行,因为命令。我认为事件处理程序的执行顺序不应该很重要?

  • 我在做拖放。我正在将一些按钮从一个VBox拖动到另一个VBbox。我现在看到的是,只有当鼠标光标进入目标的边界时,才会触发OnDragEnter事件。 我的问题是:当源按钮边框与目标列表边框重叠时,如何触发拖动事件(或其他事件)? 非常感谢你