Dream 2024-04-06 19:19 采纳率: 95.7%
浏览 0
已结题

有两个bug,一个是MIDDLE下的static报错,另一个是判断是否为鼠标中键滚轮事件下getButton报错


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();
  • 写回答

2条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考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条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀