> 文档中心 > 《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试(10)Robot 模拟键盘鼠标事件

《Java 核心技术 卷1》 笔记 第11章 异常、日志、断言和调试(10)Robot 模拟键盘鼠标事件


 

 

 11.6.3 AWT Robot

Robot 类

版本:JDK 1.3+

用途:键盘、鼠标事件发送给 AWT ,自动对用户界面检测

获取屏幕设备:

GraphicsEnvironment enviroment = GraphicsEnvironment.getLocalGraphicsEnvironment();GraphicsDevice screen = environment.getDefaultScreenDevice();

Robot 对象创建:

Robot robot = new Robot(screen);

模拟键盘按下、释放:

robot.keyPress(KeyEvent.VK_TAB);robot.keyRelease(KeyEvent.VK_TAB);

模拟鼠标移动、按下、释放:

robot.mouseMove(x, y);robot.mousePress(InputEvent.BUTTON1_MASK);robot.mouseRelease(InputEvent.BUTTON1_MASK);

操作间延迟:

Robot.delay(1000);

总体代码:

import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.beans.EventHandler; public class RobotTest {    public static void main(String[] args) throws AWTException { EventQueue.invokeLater(new Runnable() {     @Override     public void run() {  ButtonFrame frame = new ButtonFrame();  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  frame.setVisible(true);   EventQueue.invokeLater(new Runnable() {      @Override      public void run() {   GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();   GraphicsDevice screen = environment.getDefaultScreenDevice();   try{Robot robot = new Robot(screen);runTest(robot);   }catch (AWTException e){e.printStackTrace();   }      }  });      } });     }     public static void runTest(Robot robot){ robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE); robot.delay(1000); robot.keyPress(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_TAB); robot.delay(1000);  robot.keyPress(KeyEvent.VK_SPACE); robot.keyRelease(KeyEvent.VK_SPACE);  robot.delay(2000); robot.mouseMove(490 ,60); robot.mousePress(InputEvent.BUTTON1_MASK); robot.mouseRelease(InputEvent.BUTTON1_MASK);  robot.delay(2000); EventQueue.invokeLater(new Runnable() {     @Override     public void run() {  BufferedImage image = robot.createScreenCapture(new Rectangle(0,0,400,300));  ImageFrame frame = new ImageFrame(image);  frame.setVisible(true);     } });     }} class ImageFrame extends JFrame {    private static final int W = 450;    private static final int H = 350;     public ImageFrame(Image image){ setTitle("Capture"); setSize(W,H);  JLabel label = new JLabel(new ImageIcon(image)); add(label);    }}  class ButtonFrame extends JFrame implements ActionListener {    public static final int W = 300;    public static final int H = 200;    private JPanel buttonPanel;     public ButtonFrame() { setTitle("ButtonTest");   setSize(W, H); Toolkit t = Toolkit.getDefaultToolkit(); Dimension d = t.getScreenSize();// setLocation(((int) d.getWidth() - W) / 2, ((int) d.getHeight() - H) / 2); JButton yellowButton = new JButton("Yellow"); JButton blueButton = new JButton("Blue"); JButton redButton = new JButton("Red");  buttonPanel = new JPanel(); buttonPanel.add(yellowButton); buttonPanel.add(blueButton); buttonPanel.add(redButton);  add(buttonPanel);  //与下面三个this等价 //用这个方法找位置 this.addMouseMotionListener(new MouseAdapter() {     @Override     public void mouseMoved(MouseEvent e) {  System.out.println(e.getX());  System.out.println(e.getY());     } }); yellowButton.addActionListener(EventHandler.create(ActionListener.class, this, "setTitle", "source.text")); blueButton.addActionListener(EventHandler.create(ActionListener.class, this, "setTitle", "source.text")); redButton.addActionListener(EventHandler.create(ActionListener.class, this, "setTitle", "source.text")); // yellowButton.addActionListener(this);// blueButton.addActionListener(this);// redButton.addActionListener(this);     }     public void actionPerformed(ActionEvent event) {  setTitle(((JButton) event.getSource()).getText());    }}

它有几个关注点:

  • 作者给的程序本人没有跑通,开了几个EventQueue 勉强跑出来
  • Robot 点击位置是相对位置,大概是相对于当前鼠标位置,所以只能各个系统自己调(这只能测键盘吧,测鼠标也太坑了。。。)
  • ButtonFrame 是前面好多章节的代码,大概是第 8 章(作者用旧代码此处没有表述),为了方便读者也贴在代码中了

 

 

相关内容:选择 《Java核心技术 卷1》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!