Dream 2024-04-05 20:33 采纳率: 95.7%
浏览 2
已结题

从别的博主那里复制的,运行不了,能加的库都加了。还报错。


public class QMApp extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        /**
         * 内部类,将每次鼠标的行为以及坐标记录下来
         */
        class MyMouseEvent{
            //鼠标行为
            MouseButton mb;
            //坐标
            Point2D point2D;
            public MyMouseEvent(MouseButton mb, Point2D point2D) {
                this.mb = mb;
                this.point2D = point2D;
            }
        }
        //创建面板
        VBox pane = new VBox ();
        //对齐方式
        pane.setAlignment (Pos.TOP_LEFT);
        //robot关键对象
        Robot robot = new Robot ();
        //记录鼠标行为
        LinkedList<MyMouseEvent> list = new LinkedList<> ();
        //开始
        Button beginb = new Button ("开始");
        beginb.setTextFill (Color.RED);
        //结束
        Button endb = new Button ("结束");
        endb.setTextFill (Color.RED);
        pane.getChildren ().addAll (beginb,endb);
        //点击“开始”按钮时,鼠标行为储存进列表
        beginb.setOnMouseClicked (m->{
            pane.setOnMouseDragged (e->{
                list.add (new MyMouseEvent (e.getButton (),new Point2D (e.getSceneX (),e.getSceneY ())));
            });
            pane.setOnMousePressed (e->{
                list.add (new MyMouseEvent (e.getButton (),new Point2D (e.getSceneX (),e.getSceneY ())));
            });
            pane.setOnMouseReleased (e->{
                list.add (new MyMouseEvent (e.getButton (),new Point2D (e.getSceneX (),e.getSceneY ())));
            });
        });
        //点击“结束”按钮时,鼠标行为储存进列表
        endb.setOnMouseClicked (e->{
            pane.getChildren ().remove (beginb);
            for (int i = 0; i < list.size (); i++) {
                //每次鼠标模拟都将窗口透明,实现穿透
                stage.setOpacity (0);
                robot.mouseMove (list.get (i).point2D);
                robot.mouseClick (list.get (i).mb);
                try {
                    //为了效果明显,进行延迟
                    Thread.sleep (50);
                } catch (InterruptedException ex) {
                    ex.printStackTrace ();
                }
            }
        });
        //面板不参与计算边界。鼠标点击事件发生后,会计算应该是哪个组件位于鼠标所在点的位置,而该面板因为不参与边界计算,所以也不会捕获到鼠标事件
        pane.setPickOnBounds(false);
        //窗口在前,不能拖到,都没有
        stage.initStyle (StageStyle.UNDECORATED);
        //窗口最大化
        stage.setMaximized (true);
        //窗口透明度,为了使得开始按钮不会消失同时可以看见其他窗口,半透明
        stage.setOpacity (0.3);
        Scene scene = new Scene(pane);
        stage.setTitle("按键精灵");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch (args);
    }
}

setTextFill那里,还有setOnMouseClicked那里还有addAll后边括号里两个参数,还有下面三个获取坐标的new Point2D,还有下面实现穿透那里list.get(i).point2D,都报错了,我头都大了。

  • 写回答

1条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据提供的代码和报错信息,可能存在以下问题:

    1. setTextFill的使用错误
    • setTextFill是Text类的方法,Button类中没有该方法。
    • 请使用setStyle方法设置字体颜色,例如:beginb.setStyle("-fx-text-fill: red");
    1. setOnMouseClicked的错误使用
    • Button类中没有setOnMouseClicked方法,应该改为setOnAction。
    • 例如:beginb.setOnAction(e-> {...});
    1. addAll后边括号里两个参数的错误
    • addAll方法一次可以添加多个节点,应该使用逗号隔开每个节点。
    • 例如:pane.getChildren().addAll(beginb, endb);
    1. 获取坐标的错误
    • Point2D类需要导入javafx.geometry包,在类头部添加import javafx.geometry.Point2D;。
    • 例如:list.add(new MyMouseEvent(e.getButton(), new Point2D(e.getSceneX(), e.getSceneY())));
    1. 实现穿透那里获取坐标的错误
    • MyMouseEvent类中的point2D属性应该添加public修饰符以便外部调用。
    • 例如:list.get(i).point2D

    修改后的代码如下:

    import javafx.application.Application;
    import javafx.geometry.Point2D;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.scene.robot.Robot;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;
    
    import java.util.LinkedList;
    
    public class QMApp extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            /**
             * 内部类,将每次鼠标的行为以及坐标记录下来
             */
            class MyMouseEvent{
                //鼠标行为
                javafx.scene.input.MouseButton mb;
                //坐标
                public Point2D point2D;
                public MyMouseEvent(javafx.scene.input.MouseButton mb, Point2D point2D) {
                    this.mb = mb;
                    this.point2D = point2D;
                }
            }
            //创建面板
            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())));
                });
            });
            //点击“结束”按钮时,鼠标行为储存进列表
            endb.setOnAction(e->{
                pane.getChildren().remove(beginb);
                for (int i = 0; i < list.size (); i++) {
                    //每次鼠标模拟都将窗口透明,实现穿透
                    stage.setOpacity(0);
                    robot.mouseMove(list.get(i).point2D);
                    robot.mouseClick(list.get(i).mb);
                    try {
                        //为了效果明显,进行延迟
                        Thread.sleep(50);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace ();
                    }
                }
            });
            //面板不参与计算边界。鼠标点击事件发生后,会计算应该是哪个组件位于鼠标所在点的位置,而该面板因为不参与边界计算,所以也不会捕获到鼠标事件
            pane.setPickOnBounds(false);
            //窗口在前,不能拖到,都没有
            stage.initStyle(StageStyle.UNDECORATED);
            //窗口最大化
            stage.setMaximized(true);
            //窗口透明度,为了使得开始按钮不会消失同时可以看见其他窗口,半透明
            stage.setOpacity(0.3);
            Scene scene = new Scene(pane);
            stage.setTitle("按键精灵");
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

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