Posting KeyEvent ke komponen fokus

Apa cara terbaik untuk memposting Tombol Tekan ke komponen? Saya mencoba menggunakan kelas Robot dan berfungsi normal. Namun, kelas ini memiliki beberapa masalah pada beberapa platform Linux, jadi saya bertanya-tanya apa cara terbaik Java untuk memposting acara ke sebuah komponen.

Dalam kasus khusus ini, saya ingin memposting peristiwa backspace ke JTextField ketika saya menekan tombol.

EDIT: Saya sudah menggunakan kelas Robot. Saya memperbaiki masalah yang menghalangi kelas ini bekerja dengan benar di Linux


person Mario Ortegón    schedule 10.02.2009    source sumber


Jawaban (3)


Anda dapat menemukan contoh acara postingan penting tersebut, seperti di kelas ini

Postingan tersebut menggunakan 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
Itu adalah perpustakaan bagus yang Anda tunjuk kepada saya. Saya telah merobek beberapa halaman dari buku mereka;) - person Mario Ortegón; 18.02.2009

Saya akhirnya menggunakan kelas robot, yang merupakan cara termudah. Masalahnya adalah di distro Linux tertentu yang saya gunakan, instantiasi kelas Robot akan membuat Mesin Virtual hang. Melihat file log saya menemukan bahwa Java sedang mencoba memuat DLL yang tidak tersedia:

libXi.so.6

Setelah menambahkan perpustakaan ini ke distro saya dapat melanjutkan

person Mario Ortegón    schedule 10.02.2009

Ada juga pendekatan ini untuk menghindari penyampaian pada 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();
    }
}

Saya harus memperingatkan Anda bahwa jika komponen kehilangan fokus, peristiwa yang dihasilkan akan hilang! D:

person マルちゃん だよ    schedule 03.07.2012