在执行的 jTextField 操作上触发默认按钮
Fire Default Button on jTextField Action Performed
在我的程序中有一个 JButton
和 JTextField
。
我希望在 JTextField
中按下 Enter 键时触发 jButton
我不是在谈论 KeyEvent
。
private void jTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
this.getRootPane().setDefaultButton(jButton1);
}
这只是在 JTextField
中输入后启用 JButton
焦点
因此,当我进入 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
您不应在文本字段的 ActionListener
内调用 getRootPane().setDefaultButton(jButton1);
(实际上您不需要文本字段的 ActionListener
)。
你应该在 UI 初始化中调用 getRootPane().setDefaultButton(jButton1);
。
setDefaultButton(jButton1)
不存在 "fire" 回车键事件。您希望 jButton1
成为 "default" 按钮 "specify"。
看下面的演示。
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 键时显示消息对话框,那么您可以从 ActionListener 调用相同的 jButton1ActionPerformed()
像这样的文本字段:
JTextField textField = new JTextField(20);
textField.addActionListener(DefaultButton::jButton1ActionPerformed);
并删除这一行:
frame.getRootPane().setDefaultButton(button);
实现此目的的一种方法(如果我明白了这一点)是将 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));
}
}
在我的程序中有一个 JButton
和 JTextField
。
我希望在 JTextField
中按下 Enter 键时触发 jButton
我不是在谈论 KeyEvent
。
private void jTextFieldActionPerformed(java.awt.event.ActionEvent evt) {
this.getRootPane().setDefaultButton(jButton1);
}
这只是在 JTextField
中输入后启用 JButton
焦点
因此,当我进入 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
您不应在文本字段的 ActionListener
内调用 getRootPane().setDefaultButton(jButton1);
(实际上您不需要文本字段的 ActionListener
)。
你应该在 UI 初始化中调用 getRootPane().setDefaultButton(jButton1);
。
setDefaultButton(jButton1)
不存在 "fire" 回车键事件。您希望 jButton1
成为 "default" 按钮 "specify"。
看下面的演示。
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 键时显示消息对话框,那么您可以从 ActionListener 调用相同的 jButton1ActionPerformed()
像这样的文本字段:
JTextField textField = new JTextField(20);
textField.addActionListener(DefaultButton::jButton1ActionPerformed);
并删除这一行:
frame.getRootPane().setDefaultButton(button);
实现此目的的一种方法(如果我明白了这一点)是将 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));
}
}