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 static 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.getButton() == MyMouseEvent.MIDDLE) {
double deltaY = s.getDeltaY();
有两个bug,一个是MIDDLE下的static报错,另一个是判断是否为鼠标中键滚轮事件下getButton报错
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-04-06 19:19关注
晚上好🌙🌙🌙
本答案参考ChatGPT-3.5针对问题一(MIDDLE下的static报错):
问题描述:在 MyMouseEvent 类中,MouseButton.MIDDLE 常量导致编译错误,提示 static 上下文只能引用静态成员。
问题原因:MouseButton.MIDDLE 是一个非静态成员,而 MyMouseEvent 类是一个静态内部类,因此无法使用非静态成员。
解决方案:
1.修改 MyMouseEvent 类,将 MouseButton.MIDDLE 常量的值直接定义为静态 final 变量。
2.将 MyMouseEvent 类移至 Main 类的外部,使其成为一个非静态类。
代码修改:
修改方案1:
将 MyMouseEvent 类中的如下一行代码:
public static final MouseButton MIDDLE = MouseButton.MIDDLE;
改为:
public static final MouseButton MIDDLE = new MouseButton("Middle", 2);
修改方案2:
将 MyMouseEvent 类放在 Main 类外面,如下:
public class MyMouseEvent { // 鼠标行为 MouseButton mb; // 坐标 public Point2D point2D; // MIDDLE代表鼠标中键 public static final MouseButton MIDDLE = MouseButton.MIDDLE;
public MyMouseEvent(MouseButton mb, Point2D point2D) { this.mb = mb; this.point2D = point2D; }
}
针对问题二(判断是否为鼠标中键滚轮事件下 getButton 报错):
问题描述:在判断是否为鼠标中键滚轮事件时,使用 s.getButton() 获取按钮时,编译器提示 getButton() 方法不存在。
问题原因:在 JavaFX 8 中,MouseEvent 类中不存在 getButton() 方法,而是使用了 hasMiddleButton() 和 hasSideButton() 方法来检查是否存在鼠标中键和侧键。
解决方案:
1.使用 hasMiddleButton() 和 hasSideButton() 方法来检测按钮是否是鼠标中键或侧键。
2.使用 getEventType() 方法来检测事件类型是否为滚轮事件。
代码修改:
将判断鼠标中键滚轮事件的代码修改为如下:
pane.setOnScroll(s -> { // 判断鼠标事件是否为滚轮事件 if (s.getEventType().equals(MouseEvent.MOUSE_SCROLL)) { // 判断是否为鼠标中键滚轮事件 if (s.isMiddleButtonDown()) { double deltaY = s.getDeltaY(); } } });
说明:使用 isMiddleButtonDown() 方法来判断是否按下鼠标中键,并使用 getDeltaY() 方法来获取滚动距离。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决评论 打赏 举报 编辑记录无用 1
悬赏问题
- ¥15 如何让企业微信机器人实现消息汇总整合
- ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
- ¥15 如何用Python爬取各高校教师公开的教育和工作经历
- ¥15 TLE9879QXA40 电机驱动
- ¥20 对于工程问题的非线性数学模型进行线性化
- ¥15 Mirare PLUS 进行密钥认证?(详解)
- ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
- ¥20 想用ollama做一个自己的AI数据库
- ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
- ¥15 请问怎么才能复现这样的图呀