4

JTextFieldでイベントをリッスンしている でキー押下イベントをプログラムでトリガーするにはどうすればよいENTERですか?

my のキー イベントのリスナーはJTextField次のように宣言されます。

myTextField.addKeyListener(new KeyAdapter() {

    @Override
    public void keyTyped(KeyEvent e) {
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            // Do stuff
        }
    }
});

ありがとう。

4

2 に答える 2

17
  • が押されたときにトリガーされるKeyListeneronJTextField単に addを使用しないでください(アドバイスについては @robin +1 に感謝します)。ActionListenerENTER

    JTextField textField = new JTextField();
    
    textField.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
             //do stuff here when enter pressed
        }
    });
    
  • コンポーネントでの使用KeyEventをトリガーし、クラスを使用してキーの押下をシミュレートするにはrequestFocusInWindow()Robot

そのようです:

textField.requestFocusInWindow();

try { 
    Robot robot = new Robot(); 

    robot.keyPress(KeyEvent.VK_ENTER); 
} catch (AWTException e) { 
e.printStackTrace(); 
} 

例:

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JTextField textField = new JTextField();

                textField.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent ae) {
                        System.out.println("Here..");
                    }
                });
                frame.add(textField);

                frame.pack();
                frame.setVisible(true);

                textField.requestFocusInWindow();

                try {
                    Robot robot = new Robot();

                    robot.keyPress(KeyEvent.VK_ENTER);
                } catch (AWTException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

アップデート:

@Robin や @mKorbel などの他の人が示唆しているように、DocumentListener/が必要になる可能性がありますDocumentFiler(フィルターJTextFieldは更新前に検証を許可します)。

これは、データ検証 IMO の場合に必要になります。

ここでこの同様の質問を参照してください

データ検証DocumentFilterのために に を追加する方法を示します。JTextFieldドキュメントフィルターの理由は、私が言ったように、変更が表示される前に検証を許可するためです。これは、より便利な IMO です。

于 2012-11-26T10:49:58.700 に答える
4

Event を自分で作成してから、JTextField で dispatchEvent を呼び出すことができます。

  KeyEvent keyEvent = new KeyEvent(...); //create
  myTextField.dispatchEvent();

KeyEvent のパラメーターについては、KeyEvent コンストラクターを参照できます

于 2012-11-26T10:50:06.577 に答える