在jTextField上执行“触发默认按钮”操作

时间:2019-02-16 09:58:44

标签: java swing defaultbutton

在我的程序中有一个<div class="box3 right"><img src="https://picsum.photos/50/50?image=1069">right bubble using css</div> <div class="box3 left"><img src="https://picsum.photos/50/50?image=1069">left bubble using css</div>JButton
我想在JTextField中按Enter键时触发jButton,
我不是在谈论JTextField

KeyEvent

在进入private void jTextFieldActionPerformed(java.awt.event.ActionEvent evt) { this.getRootPane().setDefaultButton(jButton1); } 后,只需启用JButton焦点即可
因此,当我输入JTextField时,它必须触发JTextField ActionEvent。

并在JButton jButton1方法上使用此代码。

ActionPerformed

那么如何让private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { JOptionPane.showMessageDialog(rootPane, "Hi!"); } JButton JTextField上开火?
我尝试遵循以下答案,但在IDE中会引发异常。

ActionEvent

2 个答案:

答案 0 :(得分:0)

您不应在文本字段getRootPane().setDefaultButton(jButton1);内调用ActionListener(实际上,文本字段不需要ActionListener)。

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

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键时显示消息对话框,则可以从菜单项的ActionListener中调用相同的jButton1ActionPerformed()这样的文本字段:

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

并删除此行:

frame.getRootPane().setDefaultButton(button);

答案 1 :(得分:0)

实现这一目标的一种方法(如果我明白了这一点)是在JTextField中添加一个ActionListener,它将调用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));
    }
}