2009-02-10 5 views
1

Quelle est la meilleure façon de publier un bouton Appuyez sur un composant? J'ai essayé d'utiliser la classe Robot et ça marche normalement. Cependant, cette classe a quelques problèmes sous certaines plates-formes Linux, donc je me demande quelle est la meilleure façon Java de publier un événement sur un composant.Envoi d'un événement KeyEvent au composant ciblé

Dans ce cas particulier, je souhaite publier des événements de retour arrière sur un JTextField lorsque j'appuie sur un bouton.

EDIT: J'ai utilisé la classe Robot après tout. Je fixe le problème qui empêchait cette classe de fonctionner correctement sous Linux

Répondre

0

I fini par utiliser la classe de robot, qui était la manière la plus facile après tout. Le problème est que dans la distribution Linux spécifique que j'utilisais, l'instanciation de la classe Robot bloquait la machine virtuelle. En regardant les fichiers journaux j'ai découvert que Java a essayé de charger une DLL qui n'était pas disponible:

libXi.so.6

Après avoir ajouté cette bibliothèque à la distro que j'ai pu continuer

2

Vous trouverez par exemple d'un tel événement post-clé, comme dans this class

Ces postes utilisent la fonction dispatchEvent()

public void mousePressed(MouseEvent event) { 
    KeyboardButton key = getKey(event.getX(), event.getY()); 

[...] 

     KeyEvent ke; 
     Component source = Component.getFocusComponent(); 
     lastPressed = key; 
     lastSource = source; 
     key.setPressed(true); 

     if(source != null) { 

     if((key == k_accent || key == k_circle) && (lastKey instanceof KeyboardButtonTextJapanese)) { 
      int accent = ((KeyboardButtonTextJapanese)lastKey).getAccent(); 
      if(accent >= 1 && key == k_accent) { 

      /* 
      ** First send a backspace to delete the previous character, then send the character with the accent. 
      */ 

      source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); 
      source.dispatchEvent(new KeyEvent(source, KeyEvent.KEY_TYPED, System.currentTimeMillis(), 0, k_backspace.getKeyEvent(), k_backspace.getKeyChar())); 
+0

C'est une belle bibliothèque que vous m'avez indiquée. J'ai déchiré quelques pages de leur livre;) –

0

Il y a aussi cette approche pour éviter de relayer dans le robot:

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

public class KeyEventTest 
{ 
    public static void main(String[] args) 
    { 
     final JTextField textField = new JTextField(8); 
     textField.setFont(textField.getFont().deriveFont(18f)); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(textField, new GridBagConstraints()); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(panel); 
     f.setSize(300,160); 
     f.setLocation(200,200); 
     f.setVisible(true); 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       Toolkit toolkit = Toolkit.getDefaultToolkit(); 
       EventQueue queue = toolkit.getSystemEventQueue(); 
       try { 
        Thread.sleep(1500); 
       } catch(InterruptedException ie) { } 
       char newChar = 'x'; 
       queue.postEvent(new KeyEvent(textField, 
              KeyEvent.KEY_TYPED, 
              System.currentTimeMillis(), 
              0, 
              KeyEvent.VK_UNDEFINED, 
              newChar)); 
       try { 
        Thread.sleep(1500); 
       } catch(InterruptedException ie) { } 
       queue.postEvent(new KeyEvent(textField, 
              KeyEvent.KEY_PRESSED, 
              System.currentTimeMillis(), 
              0, 
              KeyEvent.VK_BACK_SPACE, 
              KeyEvent.CHAR_UNDEFINED)); 
      } 
     }).start(); 
    } 
} 

Je dois vous avertir que si le composant perd le focus les événements générés seront perdus! D:

Questions connexes