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);
}
把打印事件改成重复执行事件一次
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
4条回答 默认 最新
檀越@新空间 2024-04-08 08:50关注上午好☀️☀️☀️️
本答案参考ChatGPT-3.5问题:如何将鼠标操作从打印事件改为重复执行事件一次?
解决方案:
- 修改MyMouseEvent类,添加一个变量来记录鼠标行为是否重复执行。
- 在开始按钮事件中添加一个计时器,根据当前时间间隔重复执行鼠标行为。
- 修改结束按钮事件中的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); } }本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录