Erkennen Sie die Eingabetaste in JTextField

103

Ist es möglich zu erkennen, wenn jemand drückt, Enterwährend er ein JTextField in Java eingibt? Ohne eine Schaltfläche erstellen und als Standard festlegen zu müssen.

ein Sandwich
quelle

Antworten:

168

A JTextFieldwurde entwickelt, um ein ActionListenergenau wie ein JButtonis zu verwenden. Siehe die addActionListener()Methode von JTextField.

Beispielsweise:

Action action = new AbstractAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("some action");
    }
};

JTextField textField = new JTextField(10);
textField.addActionListener( action );

Jetzt wird das Ereignis ausgelöst, wenn der EnterSchlüssel verwendet wird.

Ein zusätzlicher Vorteil ist, dass Sie den Listener für eine Schaltfläche freigeben können, auch wenn Sie die Schaltfläche nicht als Standardschaltfläche festlegen möchten.

JButton button = new JButton("Do Something");
button.addActionListener( action );

Hinweis Dieses Beispiel verwendet ein Action, die implementiert , ActionListenerda Actioneine neuere API mit Zusatz - Features ist. Sie können beispielsweise Actiondas Ereignis deaktivieren, das das Ereignis sowohl für das Textfeld als auch für die Schaltfläche deaktiviert.

camickr
quelle
1
Einverstanden. Im allgemeinen Fall eleganter als meine.
Kos
@ Camickr ist ein Experte für Java Swings
Mohamed Iqzas
23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

Alles was Sie tun müssen, ist AddActionListener zum JTextField wie oben! Nachdem Sie gedrückt haben, wird Enterdie Aktion ausgeführt, was Sie bei der Anweisung wollen!

Kyorilys
quelle
16

Fügen Sie ein Ereignis für hinzu KeyPressed.

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 
Ionică Bizău
quelle
-1 :( KeyListener sind aus Swings Sicht viel zu niedrig. Verwenden Sie die API, die für Swing vorgesehen ist :-)
nIcE cOw
1
@nIcEcOw KeyListener sind aus Swings Sicht viel zu niedrig : CITATION NEEDED.
Guido
2
@ ᴳᵁᴵᴰᴼ: Ein sehr gut dokumentiertes Ding, das in den offiziellen Tutorials von KeyBindings zu finden ist , obwohl eine sehr gute Antwort auf Stackoverflow auch den gleichen Aspekt
abdeckt
1
@nIcEcOw das ist genau die Dokumentseite, an die ich gedacht habe. Ich finde einen großen Unterschied zwischen dem Vorschlag, Bindungen für Verknüpfungen und Aktionen zu bevorzugen, Listener nur zur Steuerung der Tastatur auf niedriger Ebene zu verwenden und nicht zu verwenden, weil es die falsche API ist . Die Dokumentseite ist auch nicht so schwarzweiß.
Guido
1
@ ᴳᵁᴵᴰᴼ: KeyListenershaben viele Mängel, die in größerem Maße behoben werden KeyBindings, z. B. durch Fokus, Kopieren / Einfügen und viele, viele mehr. Es ist zu vermeiden für triviale Aufgaben, wie sie im OP gefordert werden.
Eis
9

Möchtest du so etwas machen?

JTextField mTextField = new JTextField();
    mTextField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                // something like...
               //mTextField.getText();
               // or...
               //mButton.doClick();
            }
        }

    });
diegod3v
quelle
1

Fügen Sie zuerst einen Aktionsbefehl für JButton oder JTextField hinzu, indem Sie:

JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");

Fügen Sie dann ActionListener zu JTextField und JButton hinzu.

JButton.addActionListener(listener);
JTextField.addActionListener(listener);

Danach schreiben Sie auf Ihre ActionListener-Implementierung

@Override
public void actionPerformed(ActionEvent e)
{
    String actionCommand = e.getActionCommand();

    if(actionCommand.equals("Your actionCommand for JButton") || actionCommand.equals("Your   actionCommand for press Enter"))
    {
        //Do something
    }
}
greg
quelle
1

Die anderen Antworten (einschließlich der akzeptierten) sind gut, aber wenn Sie bereits Java8 verwenden, können Sie Folgendes tun (auf kürzere, neuere Weise):

textField.addActionListener(
    ae -> {
        //dostuff
    }
);

Wie die akzeptierte Antwort sagte, können Sie einfach mit einem reagieren ActionListener, der die Eingabetaste fängt.

Mein Ansatz nutzt jedoch die in Java 8 eingeführten Funktionskonzepte.

Wenn Sie dieselbe Aktion beispielsweise für eine Schaltfläche und das JTextField verwenden möchten, können Sie Folgendes tun:

ActionListener l = ae -> {
    //do stuff
}

button.addActionListener(l);
textField.addActionListener(l);

Wenn weitere Erklärungen erforderlich sind, lassen Sie es mich bitte wissen!

Thomas Böhm
quelle
0

Wenn Sie eine Standardschaltflächenaktion in einer JTextField-Eingabe festlegen möchten, müssen Sie Folgendes tun:

//put this after initComponents();

textField.addActionListener(button.getActionListeners()[0]);

Dies ist [0], da eine Schaltfläche viele Aktionen enthalten kann, normalerweise jedoch nur eine (ActionPerformed).

alexcornejo
quelle
0

Rufen Sie für jedes Textfeld in Ihrem Frame die Methode addKeyListener auf. Implementieren und überschreiben Sie dann die keyPressed-Methode, wie andere angegeben haben. Jetzt können Sie in einem beliebigen Feld Ihres Frames die Eingabetaste drücken, um Ihre Aktion zu aktivieren.

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }
Debra
quelle
-2
public void keyReleased(KeyEvent e)
{
    int key=e.getKeyCode();
    if(e.getSource()==textField)
    {
        if(key==KeyEvent.VK_ENTER)
        { 
            Toolkit.getDefaultToolkit().beep();
            textField_1.requestFocusInWindow();                     
        }
    }

Um Logik für 'Enter Press' zu schreiben JTextField, ist es besser, die Logik innerhalb des keyReleased()Blocks zu halten , anstatt keyTyped()& keyPressed().

Avnish alok
quelle
1
-1 :( für die erneute Wiederholung des gleichen Fehlers, der bereits in den vorherigen Antworten herabgestimmt wurde, zusammen mit dem angegebenen Grund dafür. KeyListenersSind aus Swingder Sicht viel zu niedrig . Verwenden Sie die API, die sein soll verwendet mit Swing :-)
nIcE cOw
-3

Verwenden Sie einfach diesen Code:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
iamprogrammer
quelle