โพสต์ KeyEvent ไปยังองค์ประกอบที่โฟกัส

วิธีที่ดีที่สุดในการโพสต์การกดปุ่มไปยังส่วนประกอบคืออะไร ฉันลองใช้คลาส Robot และใช้งานได้ตามปกติ อย่างไรก็ตาม คลาสนี้มีปัญหาบางอย่างภายใต้แพลตฟอร์ม Linux บางแพลตฟอร์ม ดังนั้นฉันจึงสงสัยว่าวิธีใดคือวิธีที่ใช้ Java อย่างเดียวที่ดีที่สุดในการโพสต์กิจกรรมไปยังคอมโพเนนต์

ในกรณีนี้ ฉันต้องการโพสต์เหตุการณ์ Backspace ไปยัง JTextField เมื่อฉันกดปุ่ม

แก้ไข: ฉันเคยใช้คลาส Robot แล้ว ฉันแก้ไขปัญหาที่ทำให้คลาสนี้ทำงานไม่ถูกต้องภายใต้ Linux


person Mario Ortegón    schedule 10.02.2009    source แหล่งที่มา


คำตอบ (3)


คุณสามารถดูตัวอย่างกิจกรรมโพสต์สำคัญดังกล่าวได้ เช่น ใน คลาสนี้

โพสต์เหล่านั้นใช้ 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()));
person VonC    schedule 10.02.2009
comment
นั่นเป็นห้องสมุดที่ดีที่คุณชี้ให้ฉันไป ฉันฉีกหน้าหนังสือของพวกเขาไปบางส่วน ;) - person Mario Ortegón; 18.02.2009

ฉันลงเอยด้วยการใช้คลาสหุ่นยนต์ ซึ่งเป็นวิธีที่ง่ายที่สุด ปัญหาคือว่าใน Linux distro เฉพาะที่ฉันใช้ การสร้างอินสแตนซ์ของคลาส Robot จะทำให้ Virtual Machine หยุดทำงาน เมื่อดูไฟล์บันทึกฉันพบว่า java พยายามโหลด DLL ที่ไม่พร้อมใช้งาน:

libXi.so.6

หลังจากเพิ่มไลบรารีนี้ลงใน distro แล้วฉันก็สามารถดำเนินการต่อได้

person Mario Ortegón    schedule 10.02.2009

นอกจากนี้ยังมีวิธีการนี้เพื่อหลีกเลี่ยงการถ่ายทอดในหุ่นยนต์:

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

ฉันต้องเตือนคุณว่าหากส่วนประกอบสูญเสียโฟกัส เหตุการณ์ที่สร้างขึ้นจะสูญหายไป! ง:

person マルちゃん だよ    schedule 03.07.2012