本文介紹了使用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按鍵按下特殊字符的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,