java.awt.Robot无法按预期运行 [英] java.awt.Robot is not functioning as expected

查看:256
本文介绍了java.awt.Robot无法按预期运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

autoPlay = new Robot();
autoPlay.setAutoDelay(500);
autoPlay.mouseMove((game.getLocationOnScreen().x + 1), (game.getLocationOnScreen().y + 1));
autoPlay.mousePress(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseMove((game.getLocationOnScreen().x + 381), (game.getLocationOnScreen().y + 1));
autoPlay.mousePress(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseMove((game.getLocationOnScreen().x + 1), (game.getLocationOnScreen().y + 381));
autoPlay.mousePress(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseMove((game.getLocationOnScreen().x + 381), (game.getLocationOnScreen().y + 381));
autoPlay.mousePress(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
autoPlay.mouseMove(currentX, currentY);

根据代码,机器人应移动到我称为game的JPanel的左上角.然后,应按下并释放鼠标左键.然后它将移至右上角并按下/释放鼠标左键.然后它将移至左下角并按下/释放鼠标左键.然后它将移至右下角并按下/释放鼠标右键.最后,它应该移回到左上角.

According to the code, the robot should move to the top left corner of a JPanel that I have called game. Then it should press and release the left mouse button. Then it should move to the top right corner and press/release the left mouse button. Then it should move to the bottom left corner and press/release the left mouse button. Then it should move to the bottom right corner and press/release the right mouse button. Finally, it should move back to the top left corner.

但是,正在发生的情况是机器人移动到了角落但没有点击.当它移回到代码末尾的左上角时,它仅单击一次.我想知道我的JDK/SDK是问题的根源还是我不理解Robot类.

However, what is happening is that the Robot moves to the corners but doesn't click. It only clicks once when it moves back to the top left corner at the end of the code. I am wondering if my JDK/SDK is the source of the problem or if I don't understand the Robot class.

推荐答案

似乎对我来说很好,也许是您的鼠标监听器?

Seems to work just fine for me, maybe it's your mouse listeners?

已更新

在Java 6和更高版本下进行了测试Java 7将BUTTON1_DOWN_MASK更改为BUTTON1_MASK,因为Java 6似乎不喜欢它...

Tested under Java 6 & Java 7, changed BUTTON1_DOWN_MASK to BUTTON1_MASK as Java 6 didn't seem to like it...go figure

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestRobot02 {

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

    public TestRobot02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                TestRobot02.TestPane testPane = new TestRobot02.TestPane();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(testPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                new Thread(new TestRobot02.RobotThread(testPane)).start();

            }
        });
    }

    public class RobotThread implements Runnable {

        private TestPane component;
        private Robot autoPlay;

        private RobotThread(TestPane component) {
            this.component = component;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TestRobot02.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                autoPlay = new Robot();

                autoPlay.setAutoDelay(500);
                autoPlay.mouseMove((component.getLocationOnScreen().x + 1), (component.getLocationOnScreen().y + 1));
                autoPlay.mousePress(InputEvent.BUTTON1_MASK);
                autoPlay.mouseRelease(InputEvent.BUTTON1_MASK);
                autoPlay.mouseMove((component.getLocationOnScreen().x + component.getWidth() - 1), (component.getLocationOnScreen().y));
                autoPlay.mousePress(InputEvent.BUTTON1_MASK);
                autoPlay.mouseRelease(InputEvent.BUTTON1_MASK);
                autoPlay.mouseMove((component.getLocationOnScreen().x + 1), (component.getLocationOnScreen().y + component.getHeight() - 1));
                autoPlay.mousePress(InputEvent.BUTTON1_MASK);
                autoPlay.mouseRelease(InputEvent.BUTTON1_MASK);
                autoPlay.mouseMove((component.getLocationOnScreen().x + component.getWidth() - 1), (component.getLocationOnScreen().y + component.getHeight() - 1));
                autoPlay.mousePress(InputEvent.BUTTON1_MASK);
                autoPlay.mouseRelease(InputEvent.BUTTON1_MASK);

                Component child = component.getComponent(0);
                Point pos = child.getLocationOnScreen();
                Dimension size = child.getSize();
                pos.x += size.width / 2;
                pos.y += size.height / 2;
                autoPlay.mouseMove(pos.x, pos.y);
                autoPlay.mousePress(InputEvent.BUTTON1_MASK);
                autoPlay.mouseRelease(InputEvent.BUTTON1_MASK);

                //                autoPlay.mouseMove(currentX, currentY);
            } catch (AWTException exp) {
                exp.printStackTrace();
            }
        }
    }

    public class TestPane extends JPanel {

        public TestPane() {
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("Mouse Clicked at " + e.getPoint());
                }

                @Override
                public void mousePressed(MouseEvent e) {
                    System.out.println("Mouse Pressed at " + e.getPoint());
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    System.out.println("Mouse Released at " + e.getPoint());
                }

            });

            setLayout(new GridBagLayout());
            JButton btn = new JButton("Click me");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("I was clicked :D");
                }
            });
            add(btn);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}

这篇关于java.awt.Robot无法按预期运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆