2009-02-10 3 views
1

Каков наилучший способ публикации кнопки Нажмите на компонент? Я пробовал использовать класс Robot, и он работает нормально. Тем не менее, у этого класса есть некоторые проблемы на некоторых Linux-платформах, поэтому я задаюсь вопросом, что лучше всего подходит для Java-событий для компонента.Опубликовать KeyEvent для сфокусированного компонента

В этом конкретном случае я хочу публиковать события backspace на JTextField, когда я нажимаю кнопку.

EDIT: В конце концов, я использовал класс Robot. Я исправил проблему, которая предотвратила этот класс из правильно работает под Linux

ответ

0

I закончил с использованием класса роботов, что было самым простым способом. Проблема в том, что в конкретном дистрибутиве Linux, который я использовал, экземпляр класса Robot зависал виртуальную машину. Глядя на лог-файлы, я обнаружил, что Java пытается загрузить DLL, которая не была доступна:

libXi.so.6

После добавления этой библиотеки в дистрибутиве я смог продолжить

2

Вы можете найти пример такого ключа после события, как в this class

Эти сообщения используют 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

Это хорошая библиотека, на которую вы указали меня. Я срывал несколько страниц с их книги;) –

0

Там же этот подход, чтобы избежать ретрансляции в роботе:

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(); 
    } 
} 

Я должен предупредить вас, что если компонент теряет фокус сгенерированных события будут потеряны! D:

Смежные вопросы