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

将list表单里的鼠标左右键和中键记录的事件都依次执行下来


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条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    问题:如何将储存鼠标行为的列表中记录的鼠标左右键和中键的事件依次执行下来?

    解决方案:

    1. 定义一个保存鼠标行为的列表,记录在其中。

    2. 当“开始”按钮被点击时,对鼠标事件进行监听,将鼠标行为添加到列表中。

    3. 当“结束”按钮被点击时,逐一遍历列表中的鼠标行为,根据记录的鼠标事件执行相应的操作。

    4. 针对中键的滚轮事件,进行特殊处理。

    5. 可以使用Robot类实现鼠标操作。

    6. 在执行鼠标操作之前,需要确保对应的窗口或控件获得了焦点。

    修改后的代码如下:

    import javafx.application.Application;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.input.MouseButton;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.VBox;
    import javafx.scene.robot.Robot;
    import javafx.stage.Stage;
    
    import java.util.LinkedList;
    
    public class Main extends Application {
    
        // 自定义鼠标事件类
        class MyMouseEvent {
            public final MouseButton mb;
            public final 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();
                        System.out.println("滚轮事件:deltaY = " + deltaY);
                    }
                });
            });
            // 点击“结束”按钮时,鼠标行为储存进列表
            endb.setOnAction(e -> {
                for (MyMouseEvent m : list) {
                    // 确保对应的窗口或控件获得了焦点
                    robot.mouseMove(m.point2D.getX(), m.point2D.getY());
                    robot.mousePress(m.mb);
                    robot.mouseRelease(m.mb);
                }
            });
            Scene scene = new Scene(pane, 500, 500);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    在执行鼠标操作前,需要确保对应控件或窗口获得了焦点,因此需要使用Robot类模拟鼠标操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(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 请问怎么才能复现这样的图呀