使用Robot类Java按键按下特殊字符 [英] Key pressing special characters using Robot class Java

查看:34
本文介绍了使用Robot类Java按键按下特殊字符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个简单地重新键入数据文件中的文本的程序。该程序一直有效,直到它命中第一个特殊字符。下面是一个例子:

数据文件

Hey what is up?

我得到的

Hey what is up (throws illegal argument exception)

以下是我的代码:


 public static void KeyPresser() throws FileNotFoundException, AWTException {
        Robot robot = new Robot();
        Scanner file = new Scanner(new File("script.dat"));
        while(file.hasNext()) {
            String word = file.nextLine();
            for(int i = 0;i<word.length();i++) {
                char c = word.charAt(i);
                if (Character.isUpperCase(c)) {
                    robot.keyPress(KeyEvent.VK_SHIFT);
                }

                robot.keyPress(Character.toUpperCase(c));
                robot.keyRelease(Character.toUpperCase(c));

                if (Character.isUpperCase(c)) {
                    robot.keyRelease(KeyEvent.VK_SHIFT);
                }
               if(c=='?') {
                   robot.keyPress(KeyEvent.VK_SHIFT);
                   robot.keyPress(KeyEvent.VK_SLASH);
                   robot.keyRelease(KeyEvent.VK_SLASH);
                   robot.keyRelease(KeyEvent.VK_SHIFT);
               }

            }

    }

        }
它会输入字母,而不是特殊字符吗?我是不是要用一个很长的开关密码?或者,有没有简单的办法来解决这个问题?如您所知,我已经尝试使用

                  if(c=='?') {
                   robot.keyPress(KeyEvent.VK_SHIFT);
                   robot.keyPress(KeyEvent.VK_SLASH);
                   robot.keyRelease(KeyEvent.VK_SLASH);
                   robot.keyRelease(KeyEvent.VK_SHIFT); 
}

但这不起作用,我该怎么办?

推荐答案

我正在编写一个简单地重新键入数据文件中的文本的程序

为什么要使用Robot重新键入文本?为什么不能直接将文本插入到文本组件的文档中。

我必须使用长的切换代码吗?

您可以使用HashMap来映射需要使用常规键进行移位的键:

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RobotString extends JPanel
{
    private static HashMap<Character, Character> keyMap = new HashMap<>();

    private JTextField original;
    private JTextField copy;


    public RobotString()
    {
        setLayout( new BorderLayout() );

        original = new JTextField(10);
        add(original, BorderLayout.PAGE_START);

        JButton button = new JButton("Use Robot");
        add(button, BorderLayout.CENTER);
        button.addActionListener((e) -> invokeRobot() );

        copy = new JTextField(10);
        add(copy, BorderLayout.PAGE_END);

        //  Create mapping of keys

        keyMap.put('!', '1');
        keyMap.put('@', '2');
        keyMap.put('#', '3');
        keyMap.put(':', ';');
        keyMap.put('?', '/');
    }

    private void invokeRobot()
    {
        copy.requestFocusInWindow();
        copy.setText( "" );

        try
        {
            Robot robot = new Robot();

            char[] letters = original.getText().toCharArray();

            for(char letter: letters)
            {
                boolean shiftRequired = false;
                Character value = keyMap.get(letter);

                if (value != null)
                {
                    shiftRequired = true;
                    letter = value;
                }
                else if (Character.isUpperCase(letter))
                {
                    shiftRequired = true;
                }

                int keyCode = KeyEvent.getExtendedKeyCodeForChar( letter );

                if (shiftRequired)
                    robot.keyPress(java.awt.event.KeyEvent.VK_SHIFT);

                robot.keyPress( keyCode );
                robot.keyRelease( keyCode );

                if (shiftRequired)
                    robot.keyRelease(java.awt.event.KeyEvent.VK_SHIFT);
            }
        }
        catch(Exception e) { e.printStackTrace(); }
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new RobotString());
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}
只需在顶部文本字段中键入文本字符串,然后单击按钮即可。请注意,它只支持几个特殊字符。 但请注意,这不是一个可靠的解决方案,因为映射依赖于键盘。

我现在知道为所有键盘提供通用解决方案的方法。

这篇关于使用Robot类Java按键按下特殊字符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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