0

在我的程序中有一个JButtonand JTextField
我希望 jButton 在按 Enter 键时触发,JTextField
我不是在说KeyEvent.

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

这只是JButton在输入后启用焦点JTextField
所以当我输入 JTextField 时,它必须触发JButtonActionEvent。

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 
4

2 回答 2

0

您不应该getRootPane().setDefaultButton(jButton1);ActionListenerof 文本字段内调用(实际上您不需要ActionListenerfor 文本字段)。

您应该调用getRootPane().setDefaultButton(jButton1);UI 初始化。

setDefaultButton(jButton1)不是在那里“触发” Enter 键事件。它可以“指定”您想要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);
于 2019-02-16T10:10:20.980 回答
0

实现这一点的一种方法(如果我明白这一点)是向ActionListener将调用JButton#doClick()方法的 JTextField 添加一个。(我认为该方法的作用很清楚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));
    }
}
于 2019-02-16T14:12:04.103 回答