Tou fazendo umas adaptacoes no Selenium (pra que ele possa fazer upload de arquivos em browsers que nao o Firefox), e esbarrei num probleminha meio chato: na java.awt.Robot tem um metodo keyPress(int keycode) que recebe aqueles KeyEvent.VK_*.
O problema eh que eu quero digitar uma String inteira, com o nome do arquivo. Eu teria que transformar algo como “C:\foo.jpg” em:
…o que parece relativamente simples, ate vc ver que nao tem nada na API que faca isso (e o mais proximo, Character.getNumericValue e equivalentes, nao te dao um keycode pra maioria das coisas nao-alfabeticas, como ‘:’ e ‘.’).
public static void main(String[] args) {
char[] test = "C:\\code\\selenium-rc\\native_upload\\test-type.jpg".toCharArray();
for (int i = 0; i < test.length; i++) {
System.out.print(AWTKeyStroke.getAWTKeyStroke(test[i]).getKeyChar());
}
}
Também não sei se a sequência é seguida para os caracteres não-alfabéticos, mas não dá pra criar uma classe utilitária com um bloco estático mais ou menos assim?
Map<Char, Int> keysMap = new HashMap<Char, Int>();
for(int i = 0; i < 256; ++i) keysMap.put(i, i);
E ter nessa classe um método estático do tipo
public static int getKeyCode(char key) {
return keysMap.get(key);
}
Talvez eu não tenha entendido direito seu problema…
…foi o que eu acabei fazendo, mas mesmo assim dei de cara com outra parede:
int colon = KeyEvent.VK_COLON; // = 513
robot.keyPress(colon);
resulta em:
java.lang.IllegalArgumentException: Invalid key code
at sun.awt.windows.WRobotPeer.keyPress(Native Method)
at java.awt.Robot.keyPress(Unknown Source)
at org.openqa.selenium.server.SeleniumDriverResourceHandler.doCommand(Se
leniumDriverResourceHandler.java:464)
já que a tecla “:” não existe no teclado (só “;” e você precisa usar o Shift para acessar o “:”. )
Estou supondo que você esteja usando o teclado americano; não sei se o inglês é tão diferente assim do americano.
(Eu sei que o teclado francês é “AZERTY” em vez de “QWERTY” e outras coisas mais estranhas).
(O teclado ABNT ou brasileiro tem um monte de teclas fora do lugar, mas o “:” continua sobre o “;”. )
EDIT - Olhei e é sutilmente diferente quanto a alguns caracteres.
Realmente, existem algumas dessas barreiras… Alguns caracteres de pontuação ficam em intervalos diferentes…
O dois pontos e o ponto e vírgula ficam “455” unidades a mais que o código do caracter… Tentei verificar com mais caracteres, mas nada…
Por exemplo, o VK_COLON é ( ( ( int ) ‘:’ ) + 455 ) == 513
Fiquei uma meia hora tentando pensar em algo, mas não tive nenhum idéia diferente das que vocês já postaram…
Valeu, galera. A solucao final acabou meio como uma mistura do que o daviduzatto e o cassio sugeriram.
Ah, e thingol - matou a pau. O lance eh o mesmo pra (, ) e todos os caracteres do genero. Ainda nao testei o #, que no meu Mac eh feito com Alt+3, mas como # nao ocorre em nenhum dos arquivos que eu tenho que usar pra testar aqui, nao tem la tanto problema.
Caraca isso me lembra quando brincavamos de fazer jogo em pascal la por volta de 1996 e tinhamos que tratar as interrupções do teclado porquê o keycode tinha algumas bizarrices tipos essas …