將按鈕發佈到組件的最佳方式是什麼?我嘗試使用Robot類,它通常工作。然而,這個類在一些Linux平臺下有一些問題,所以我想知道什麼是將事件發佈到組件的最佳Java方法。將KeyEvent發佈到聚焦組件
在這種特殊情況下,我想在按下按鈕時將退格事件發佈到JTextField。
編輯:我已經使用了機器人課。我修復了阻止這一類從Linux下正常工作
將按鈕發佈到組件的最佳方式是什麼?我嘗試使用Robot類,它通常工作。然而,這個類在一些Linux平臺下有一些問題,所以我想知道什麼是將事件發佈到組件的最佳Java方法。將KeyEvent發佈到聚焦組件
在這種特殊情況下,我想在按下按鈕時將退格事件發佈到JTextField。
編輯:我已經使用了機器人課。我修復了阻止這一類從Linux下正常工作
我的問題最後使用機器人課,這是最簡單的方法。問題在於,在我使用的特定Linux發行版中,Robot類的實例會掛起虛擬機。望着日誌文件,我發現Java是試圖加載DLL,這是不可用:
libXi.so.6
加入這個庫的發行版,我能夠繼續後
你可以發現這樣的關鍵崗位的事件,就像在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()));
還有這種方法來避免機器人中繼:
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:
這是你指給我的一個不錯的圖書館。我一直在撕掉他們書中的一些頁面;) – 2009-02-18 08:42:46