Dream 2024-04-08 08:50 采纳率: 84.6%
浏览 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条回答 默认 最新

  • 檀越@新空间 2024-04-08 08:50
    关注

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

    问题:如何将鼠标操作从打印事件改为重复执行事件一次?

    解决方案:

    1. 修改MyMouseEvent类,添加一个变量来记录鼠标行为是否重复执行。
    2. 在开始按钮事件中添加一个计时器,根据当前时间间隔重复执行鼠标行为。
    3. 修改结束按钮事件中的for循环,调用Robot类的方法来执行鼠标行为。

    修改后的代码:

    import javafx.application.Application;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.VBox;
    import javafx.scene.input.MouseButton;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.input.ScrollEvent;
    import javafx.scene.robot.Robot;
    import javafx.stage.Stage;
    import javafx.geometry.Point2D;
    import java.util.LinkedList;
    import java.util.Timer;
    import java.util.TimerTask;
    import java.util.concurrent.TimeUnit;
    
    public class MouseRecorder extends Application {
        
        public class MyMouseEvent {
            public MouseButton mb;
            public Point2D point2D;
            public boolean repeat = false;
    
            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);
    
            Timer timer = new Timer();
            long interval = TimeUnit.SECONDS.toMillis(1);
    
            // 点击“开始”按钮时,鼠标行为储存进列表
            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);
                    }
                });
    
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        for (MyMouseEvent m : list) {
                            if(m.repeat){
                                robot.mousePress(m.mb);
                                robot.mouseRelease(m.mb);
                                System.out.println("鼠标" + m.mb.toString() + "重复执行:" + "(" + m.point2D.getX() + ", " + m.point2D.getY() + ")");
                            } else {
                                System.out.println("鼠标" + m.mb.toString() + ":" + "(" + m.point2D.getX() + ", " + m.point2D.getY() + ")");
                            }
                            m.repeat = true;
                        }
                    }
                }, interval, interval);
            });
            // 点击“结束”按钮时,鼠标行为储存进列表
            endb.setOnAction(e -> {
                for (MyMouseEvent m : list) {
                    m.repeat = false;
                }
            });
    
            Scene scene = new Scene(pane, 500, 500);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

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