Кнопка запуска по умолчанию для выполненного действия jTextField - PullRequest
0 голосов
/ 16 февраля 2019

В моей программе есть JButton и JTextField.
Я хочу, чтобы jButton срабатывал при нажатии клавиши Enter в JTextField
Я не говорю о KeyEvent.

private void jTextFieldActionPerformed(java.awt.event.ActionEvent evt) {                                            
    this.getRootPane().setDefaultButton(jButton1);
}

Это только делает фокусировку JButton включенной после ввода в JTextField
Так что, когда я войду в JTextField, он должен запустить JButton ActionEvent.

И этот код для метода jButton1 ActionPerformed.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JOptionPane.showMessageDialog(rootPane, "Hi!");
    } 

Так, как я могу сделать JButton запущенным на JTextField ActionEvent?
Я попробовал следующий ответ, но в IDE выдает исключение.

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: javax.swing.JButton.addActionListener 

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Один из способов добиться этого (если я понял это прямо), это добавить ActionListener в JTextField, который вызовет метод JButton#doClick().(Я думаю, что довольно ясно, что делает метод doClick()).

Пример:

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class FireButtonOnEnter extends JFrame {
    private static final long serialVersionUID = -7346953935931623335L;

    public FireButtonOnEnter() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationRelativeTo(null);
        getContentPane().setLayout(new FlowLayout());
        JTextField textField = new JTextField(15);
        JButton button = new JButton("Print Hello");
        button.addActionListener(e -> System.out.println("Hello world."));
        textField.addActionListener(e -> button.doClick());
        getContentPane().add(textField);
        getContentPane().add(button);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new FireButtonOnEnter().setVisible(true));
    }
}
0 голосов
/ 16 февраля 2019

Вы НЕ должны вызывать getRootPane().setDefaultButton(jButton1); внутри ActionListener текстового поля (на самом деле вам не нужно ActionListener для текстового поля).

Вы должны вызывать getRootPane().setDefaultButton(jButton1); при инициализации пользовательского интерфейса.

setDefaultButton(jButton1) НЕ существует, чтобы "запустить" событие ввода клавиши.Здесь нужно «указать», что вы хотите, чтобы jButton1 была кнопкой «по умолчанию».

См. Демонстрацию ниже.

import javax.swing.*;
import java.awt.FlowLayout;

public class DefaultButton {

  public static void main(String[] args) {

    JButton button = new JButton("Button 1");
    button.addActionListener(DefaultButton::jButton1ActionPerformed);

    JTextField textField = new JTextField(20);

    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new FlowLayout());
    frame.getContentPane().add(button);
    frame.getContentPane().add(textField);

    frame.getRootPane().setDefaultButton(button);

    frame.setBounds(300, 200, 400, 300);
    frame.setVisible(true);
  }

  private static void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    JOptionPane.showMessageDialog(null, "Hi!");
  }
}

ОБНОВЛЕНИЕ:

Если вы не хотите делать button кнопкой по умолчанию и просто хотите показать диалоговое окно сообщения, когда пользователь нажимает клавишу Enter, тогда вы можете вызвать тот же jButton1ActionPerformed() из ActionListener текстового поля, какэто:

JTextField textField = new JTextField(20);
textField.addActionListener(DefaultButton::jButton1ActionPerformed);

и уберите эту строку:

frame.getRootPane().setDefaultButton(button);
...