2009-02-10 96 views
1

將按鈕發佈到組件的最佳方式是什麼?我嘗試使用Robot類,它通常工作。然而,這個類在一些Linux平臺下有一些問題,所以我想知道什麼是將事件發佈到組件的最佳Java方法。將KeyEvent發佈到聚焦組件

在這種特殊情況下,我想在按下按鈕時將退格事件發佈到JTextField。

編輯:我已經使用了機器人課。我修復了阻止這一類從Linux下正常工作

回答

0

我的問題最後使用機器人課,這是最簡單的方法。問題在於,在我使用的特定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

這是你指給我的一個不錯的圖書館。我一直在撕掉他們書中的一些頁面;) – 2009-02-18 08:42:46

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: