package sample;
import java.awt.Point; import java.util.LinkedList;
import javafx.application.Application; import
javafx.geometry.Point2D; 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.paint.Color; import javafx.scene.robot.Robot; import javafx.stage.Stage;
public class Main extends Application {/***内
部类,将每次鼠标的行为以及坐标记录下来*/
class MyMouseEvent {
//鼠标行为
MouseButton mb;
// 坐标
public Point2D point2D;
// MIDDLE代表鼠标中键
public final MouseButton MIDDLE= MouseButton.MIDDLE;
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);
}
}
不管我用isMiddleButtonDown和getButton都报错,我的javafx高版本和低版本都试过了,都不行。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-04-06 21:35关注
晚上好🌙🌙🌙
本答案参考ChatGPT-3.5问题:使用isMiddleButtonDown和getButton时,无论使用高版本还是低版本都会报错。
解决方案:
-
检查导入的包是否正确,确保导入的是javafx.scene.input包下的MouseButton和MouseEvent类。
-
检查使用的jdk版本是否支持isMiddleButtonDown和getButton方法,这两个方法是从JavaFX 8u40版本开始支持的,如果使用的是低于该版本的jdk,则无法使用这两个方法。
-
使用较早版本的jdk时,可以使用Button枚举类获取鼠标按键,使用以下代码检测中键按下:
if (m.getButton() == Button.MIDDLE) { // do something }
- 如果在使用较新版本的jdk时仍然无法正常使用isMiddleButtonDown和getButton方法,可以检查所使用的场景(scene)对象是否正确初始化,并确保能够正常获取到输入事件(Event)。
修改后的代码:
import java.awt.Point; import java.util.LinkedList; import javafx.application.Application; import javafx.geometry.Point2D; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.ButtonType; import javafx.scene.input.MouseEvent; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.robot.Robot; import javafx.stage.Stage;
public class Main extends Application { /** * 内部类,将每次鼠标的行为以及坐标记录下来 */ class MyMouseEvent { // 鼠标行为 ButtonType mb; // 坐标 public Point2D point2D; // MIDDLE代表鼠标中键 public final ButtonType MIDDLE = ButtonType.MIDDLE;
public MyMouseEvent(ButtonType 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.getButton() == ButtonType.MIDDLE) { 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); }
}
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报 编辑记录无用 1 -
悬赏问题
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动
- ¥20 对于工程问题的非线性数学模型进行线性化
- ¥15 Mirare PLUS 进行密钥认证?(详解)
- ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
- ¥20 想用ollama做一个自己的AI数据库
- ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
- ¥15 请问怎么才能复现这样的图呀