簡體   English   中英

在jTextField上執行“觸發默認按鈕”操作

[英]Fire Default Button on jTextField Action Performed

在我的程序中有一個JButtonJTextField
我想在按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!");
    } 

那么如何使JButtonJTextField ActionEvent上觸發?
我嘗試了以下答案,但在IDE中拋出異常。

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

您不應調用getRootPane().setDefaultButton(jButton1); 在文本字段的ActionListener中(實際上,文本字段不需要ActionListener )。

您應該調用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鍵時顯示消息對話框,則可以從文本字段的ActionListener調用相同的jButton1ActionPerformed() ,如下所示:

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

並刪除此行:

frame.getRootPane().setDefaultButton(button);

實現此目的的一種方法(如果我明白這一點),是向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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM