Dream 2024-04-08 10:02 采纳率: 95.7%
浏览 0
已结题

如何实现点击结束按钮时执行一遍录入的鼠标中键动作


public MyMouseEvent(MouseButton mb, Point2D point2D) {
        this.mb = mb;
        this.point2D = point2D;
    }
}
@Override
public void start(Stage stage) throws Exception {
    // 创建面板
    VBox pane = new VBox();
    // 对齐方式
    pane.setAlignment(Pos.TOP_LEFT);
    // robot关键对象
    Robot robot = new Robot();
    // 记录鼠标行为
    LinkedList<MyMouseEvent> list = new LinkedList<>();
    // 开始
    Button beginb = new Button("开始");
    beginb.setStyle("-fx-text-fill: red");
    // 结束
    Button endb = new Button("结束");
    endb.setStyle("-fx-text-fill: red");
    pane.getChildren().addAll(beginb, endb);
    // 点击“开始”按钮时,鼠标行为储存进列表
    beginb.setOnAction(e -> {
        pane.setOnMouseDragged(m -> {
            list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
        });
        pane.setOnMousePressed(m -> {
            list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
        });
        pane.setOnMouseReleased(m -> {
            list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
        });
        // 针对鼠标中键的滚轮事件
        pane.setOnScroll(s -> {
            // 判断是否为鼠标中键滚轮事件
            if (s.isMiddleButtonDown()) {
                double deltaY = s.getDeltaY();
                System.out.println("滚轮事件:deltaY = " + deltaY);
            }
        });
    });
    // 点击“结束”按钮时,鼠标行为储存进列表
    endb.setOnAction(e -> {
        for (MyMouseEvent m : list) {
            // 判断是否为鼠标中键按动事件
            if (m.mb == m.MIDDLE) {
                System.out.println("中键按动事件:(" + m.point2D.getX() + ", " + m.point2D.getY() + ")");
            } else {
                System.out.println("鼠标" + m.mb.toString() + ":" + "(" + m.point2D.getX() + ", " + m.point2D.getY()
                        + ")");
            }
        }
    });
    Scene scene = new Scene(pane, 500, 500);
    stage.setScene(scene);
    stage.show();
}
public static void main(String[] args) {
    launch(args);
}
  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-04-08 10:04
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据您的描述,您想要实现一个功能,在点击“结束”按钮时执行一遍录入的鼠标中键动作。您的代码中已经实现了在点击“开始”按钮时记录鼠标行为,并且在点击“结束”按钮时打印这些行为。现在需要在点击“结束”按钮时执行一遍录入的鼠标中键动作。
    解决思路如下:

    1. 在记录鼠标行为时,不仅要将行为存储到列表中,还需要将鼠标中键的滚轮事件单独存储到一个队列中。
    2. 在点击“结束”按钮时,遍历鼠标行为列表,并执行鼠标按键和移动操作。在遍历队列时,执行鼠标中键滚轮事件。
      修改后的代码如下:
      javaCopy code
      import javafx.application.Application;
      import javafx.geometry.Point2D;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.input.MouseButton;
      import javafx.scene.layout.VBox;
      import javafx.stage.Stage;
      import java.awt.Robot;
      import java.util.LinkedList;
      import java.util.Queue;
      public class Main extends Application {
      private Queue<Double> scrollEvents = new LinkedList<>();
      private class MyMouseEvent {
      private MouseButton mb;
      private Point2D point2D;
      public MyMouseEvent(MouseButton mb, Point2D point2D) {
      this.mb = mb;
      this.point2D = point2D;
      }
      }
      @Override
      public void start(Stage stage) throws Exception {
      // 创建面板
      VBox pane = new VBox();
      // 对齐方式
      pane.setAlignment(Pos.TOP_LEFT);
      // robot关键对象
      Robot robot = new Robot();
      // 记录鼠标行为
      LinkedList<MyMouseEvent> list = new LinkedList<>();
      // 开始
      Button beginb = new Button("开始");
      beginb.setStyle("-fx-text-fill: red");
      // 结束
      Button endb = new Button("结束");
      endb.setStyle("-fx-text-fill: red");
      pane.getChildren().addAll(beginb, endb);
      // 点击“开始”按钮时,鼠标行为储存进列表
      beginb.setOnAction(e -> {
      pane.setOnMouseDragged(m -> {
      list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
      });
      pane.setOnMousePressed(m -> {
      list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
      });
      pane.setOnMouseReleased(m -> {
      list.add(new MyMouseEvent(m.getButton(), new Point2D(m.getSceneX(), m.getSceneY())));
      });
      // 针对鼠标中键的滚轮事件
      pane.setOnScroll(s -> {
      // 判断是否为鼠标中键滚轮事件
      if (s.isMiddleButtonDown()) {
      double deltaY = s.getDeltaY();
      scrollEvents.add(deltaY);
      }
      });
      });
      // 点击“结束”按钮时,鼠标行为储存进列表
      endb.setOnAction(e -> {
      for (MyMouseEvent m : list) {
      // 判断是否为鼠标中键按动事件
      if (m.mb == m.MIDDLE) {
      System.out.println("中键按动事件:(" + m.point2D.getX() + ", " + m.point2D.getY() + ")");
      robot.mouseMove((int) m.point2D.getX(), (int) m.point2D.getY());
      robot.mousePress(InputEvent.BUTTON2_DOWN_MASK);
      robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
      } else {
      System.out.println("鼠标" + m.mb.toString() + ":" + "(" + m.point2D.getX() + ", " + m.point2D.getY() + ")");
      robot.mouseMove((int) m.point2D.getX(), (int) m.point2D.getY());
      robot.mousePress(getButtonMask(m.mb));
      robot.mouseRelease(getButtonMask(m.mb));
      }
      }
      while (!scrollEvents.isEmpty()) {
      double deltaY = scrollEvents.poll();
      System.out.println("滚轮事件:deltaY = " + deltaY);
      robot.mouseWheel((int) deltaY);
      }
      });
      Scene scene = new Scene(pane, 500, 500);
      stage.setScene(scene);
      stage.show();
      }
      private int getButtonMask(MouseButton button) {
      switch (button) {
      case PRIMARY:
      return InputEvent.BUTTON1_DOWN_MASK;
      case SECONDARY:
      return InputEvent.BUTTON3_DOWN_MASK;
      default:
      return 0;
      }
      }
      public static void main(String[] args) {
      launch(args);
      }
      }
      
      这样在点击“结束”按钮时,会执行一遍录入的鼠标中键动作。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀