Обнаружить ввод, нажмите в JTextField


103

Можно ли определить, когда кто-то нажимает Enterпри вводе JTextField в java? Без необходимости создавать кнопку и устанавливать ее по умолчанию.

Ответы:


168

A JTextFieldбыл разработан для использования в ActionListenerточности как JButtonесть. См. addActionListener()Метод JTextField.

Например:

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

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

Теперь событие запускается при использовании Enterключа.

Кроме того, дополнительным преимуществом является то, что вы можете поделиться слушателем с помощью кнопки, даже если вы не хотите делать кнопку кнопкой по умолчанию.

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

Обратите внимание: в этом примере используется Action, который реализует, ActionListenerпотому что Actionэто новый API с дополнительными функциями. Например, вы можете отключить, Actionчто отключит событие как для текстового поля, так и для кнопки.


1
Согласовано. В общем случае более элегантное решение, чем мое.
Кос,

@camickr - эксперт по Java-
качелям

23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

все, что вам нужно сделать, это добавитьActionListener в JTextField, как указано выше! После нажатия Enterна выписку действие будет выполнено, что вы хотите!


17

Добавить мероприятие для KeyPressed.

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 

-1 :( KeyListeners слишком низкого уровня с точки зрения Swing. Используйте API, который предназначен для использования с Swing :-)
nIcE cOw

1
@nIcEcOw KeyListeners слишком низкий уровень с точки зрения Swing : ЦИТИРОВАНИЕ НЕОБХОДИМО.
guido

2
@ ᴳᵁᴵᴰᴼ: Очень хорошо задокументированная штука, которую можно найти в официальных руководствах по KeyBindings , хотя очень хороший ответ по stackoverflow также охватывает тот же аспект :-)
nIcE cOw

1
@nIcEcOw это именно та страница документа, которую я имел в виду. Я обнаружил большую разницу между предложением предпочесть привязки для ярлыков и действий, использовать только слушателей для управления клавиатурой на низком уровне и не использовать, потому что это неправильный api . Страница документа тоже не такая уж черно-белая.
guido

1
@ ᴳᵁᴵᴰᴼ: KeyListenersимеет много недостатков, о которых в большей степени заботятся KeyBindings, например, связанные с фокусом, копированием / вставкой и многими другими. Этого следует избегать для тривиальных задач, например, как указано в OP.
nIcE cOw

9

Вы хотите сделать что-то подобное?

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

    });

1

Сначала добавьте команду действия в JButton или JTextField:

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

Затем добавьте ActionListener как в JTextField, так и в JButton.

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

После этого в реализации ActionListener напишите

@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
    }
}

1

Другие ответы (включая принятые) хороши, но если вы уже используете Java8, вы можете сделать следующее (более коротким и новым способом):

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

Как сказано в принятом ответе, вы можете просто отреагировать с помощью ActionListener, который улавливает клавишу Enter.

Однако в моем подходе используются функциональные концепции, представленные в Java 8.

Если вы хотите использовать одно и то же действие, например, для кнопки и JTextField, вы можете сделать следующее:

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

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

Если потребуется дополнительное объяснение, дайте мне знать!


0

Если вы хотите установить действие кнопки по умолчанию во вводе JTextField, вы должны сделать это:

//put this after initComponents();

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

Это [0], потому что кнопка может иметь много действий, но обычно имеет только одно (ActionPerformed).


0

Для каждого текстового поля в вашем фрейме вызовите метод addKeyListener. Затем реализуйте и переопределите метод keyPressed, как указывали другие. Теперь вы можете нажать Enter из любого поля вашего фрейма, чтобы активировать свое действие.

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

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

Чтобы написать логику для «Enter press» в JTextField, лучше сохранить логику внутри keyReleased()блока вместо keyTyped()& keyPressed().


1
-1 :( для повторения той же ошибки еще раз, которая уже была отклонена в предыдущих ответах, вместе с указанной причиной того же самого. KeyListenersСлишком низкий уровень Swingс точки зрения России. Используйте API, который предназначен для используется с Swing :-)
nIcE cOw

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.