Fiz uns teste simples e constatei que o problema está em utilizar essa detecção é por estar usando com o JavaFx. Fiz dois formulários bem simples contento apenas um TextField e um Label, primeiramente em JavaFx:
public class TestaCapsOnJavaFx extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox();
TextField teste = new TextField();
final Label msg = new Label("CAPS LOCK ESTÁ ATIVADA");
teste.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent arg0) {
if (Toolkit.getDefaultToolkit().getLockingKeyState(
java.awt.event.KeyEvent.VK_CAPS_LOCK)) {
msg.setVisible(true);
} else {
msg.setVisible(false);
}
}
});
msg.setVisible(false);
root.getChildren().addAll(teste, msg);
Scene scene = new Scene(root, 200, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args
*/
public static void main(String[] args) {
Application.launch(args);
}
}
Dessa forma continua apresentando o mesmo erro que citei nos posts acima. Num segundo momento fiz um form usando Swing:
public class TestaCapsOnSwing extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestaCapsOnSwing frame = new TestaCapsOnSwing();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestaCapsOnSwing() {
setTitle("Testa Caps Lock");
setBounds(100, 100, 200, 100);
setLayout(new BorderLayout());
JTextField teste = new JTextField();
final JLabel msg = new JLabel("CAPS LOCK ESTÁ ATIVADA");
msg.setVisible(false);
teste.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
if (Toolkit.getDefaultToolkit().getLockingKeyState(
java.awt.event.KeyEvent.VK_CAPS_LOCK)) {
msg.setVisible(true);
} else {
msg.setVisible(false);
}
}
});
getContentPane().add(teste, BorderLayout.NORTH);
getContentPane().add(msg, BorderLayout.CENTER);
}
}
Assim a detecção usando o Toolkit.getDefaultToolkit().getLockingKeyState funcionou como o esperado.
O que infelizmente ainda naum encontrei eh pq isso acontece e como solucionar o problema.
Continuo no aguardo de novas possibilidades de como solucionar o problema envolvendo o Toolkit.getDefaultToolkit().getLockingKeyState juntamente com JavaFx ou novas maneiras de realizar essa detecção.