Виявити натисніть клавішу в 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!!!

                }});

все, що вам потрібно зробити, це addActionListener до JTextField, як вище! Після натискання Enterдія виконає те, що ви хочете під час виписки!


16

Додати подію для 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 : ПОТРІБНО ЦИТУВАННЯ .
гідо

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

1
@nIcEcOw саме про цю сторінку, яку я мав на увазі. Я знаходжу велику різницю між пропозицією віддати перевагу прив’язки для ярликів та дій, використовуйте лише слухачів для керування клавіатурою на низькому рівні та не використовуйте, оскільки це неправильна api . Сторінка doc теж не така чорно-біла.
гідо

1
@ ᴳᵁᴵᴰᴼ: KeyListenersмає багато недоліків, за якими в більшій мірі усунені KeyBindingsтакі, як, наприклад, пов’язані з фокусом, копіювання / вставка та багато інших. Цього слід уникати для тривіальних завдань, таких як запитання в ОП.
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. Потім реалізуйте та перекрийте метод keyPress, як показали інші. Тепер ви можете натиснути клавішу 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

-3

Просто використовуйте цей код:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.