Có thể phát hiện khi ai đó nhấn Entertrong khi nhập JTextField trong java không? Mà không cần phải tạo một nút và đặt nó làm mặc định.
Có thể phát hiện khi ai đó nhấn Entertrong khi nhập JTextField trong java không? Mà không cần phải tạo một nút và đặt nó làm mặc định.
Câu trả lời:
A JTextField
được thiết kế để sử dụng ActionListener
giống như một JButton
. Xem addActionListener()
phương pháp của JTextField
.
Ví dụ:
Action action = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("some action");
}
};
JTextField textField = new JTextField(10);
textField.addActionListener( action );
Bây giờ sự kiện được kích hoạt khi Enterkhóa được sử dụng.
Ngoài ra, một lợi ích bổ sung là bạn có thể chia sẻ trình nghe bằng một nút ngay cả khi bạn không muốn đặt nút này thành nút mặc định.
JButton button = new JButton("Do Something");
button.addActionListener( action );
Lưu ý, ví dụ này sử dụng một Action
, thực thi ActionListener
vì Action
là một API mới hơn với các tính năng bổ sung. Ví dụ: bạn có thể tắt tùy chọn Action
này sẽ vô hiệu hóa sự kiện cho cả trường văn bản và nút.
JTextField function=new JTextField(8);
function.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//statements!!!
}});
tất cả những gì bạn cần làm là addActionListener vào JTextField như trên! Sau khi bạn nhấn Enterhành động sẽ thực hiện những gì bạn muốn ở câu lệnh!
Thêm một sự kiện cho KeyPressed
.
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
// Enter was pressed. Your code goes here.
}
}
KeyListeners
có nhiều thiếu sót, được chăm sóc ở mức độ lớn hơn KeyBindings
, chẳng hạn như liên quan đến tiêu điểm, liên quan đến sao chép / dán và nhiều hơn nữa. Nó phải được tránh, đối với các nhiệm vụ nhỏ, chẳng hạn như, như được yêu cầu trong OP.
Bạn có muốn làm điều gì đó như thế này không?
JTextField mTextField = new JTextField();
mTextField.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER){
// something like...
//mTextField.getText();
// or...
//mButton.doClick();
}
}
});
Đầu tiên hãy thêm lệnh hành động trên JButton hoặc JTextField bằng cách:
JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");
Sau đó, thêm ActionListener vào cả JTextField và JButton.
JButton.addActionListener(listener);
JTextField.addActionListener(listener);
Sau đó, về việc triển khai ActionListener của bạn, hãy viết
@Override
public void actionPerformed(ActionEvent e)
{
String actionCommand = e.getActionCommand();
if(actionCommand.equals("Your actionCommand for JButton") || actionCommand.equals("Your actionCommand for press Enter"))
{
//Do something
}
}
Các câu trả lời khác (bao gồm cả những câu được chấp nhận) là tốt, nhưng nếu bạn đã sử dụng Java8, bạn có thể làm như sau (theo cách ngắn hơn, mới hơn):
textField.addActionListener(
ae -> {
//dostuff
}
);
Như câu trả lời được chấp nhận đã nói, bạn có thể chỉ cần phản ứng với một ActionListener
, bắt được phím Enter.
Tuy nhiên, cách tiếp cận của tôi có lợi từ các khái niệm chức năng đã được giới thiệu trong Java 8.
Nếu bạn muốn sử dụng cùng một hành động, chẳng hạn cho một nút và JTextField, bạn có thể làm như sau:
ActionListener l = ae -> {
//do stuff
}
button.addActionListener(l);
textField.addActionListener(l);
Nếu cần giải thích thêm, vui lòng cho tôi biết!
Nếu bạn muốn đặt một hành động nút mặc định trong một lần nhập JTextField, bạn phải thực hiện điều này:
//put this after initComponents();
textField.addActionListener(button.getActionListeners()[0]);
Đó là [0] vì một nút có thể có nhiều hành động, nhưng thông thường chỉ có một (ActionPerformed).
Đối với mỗi trường văn bản trong khung của bạn, hãy gọi phương thức addKeyListener. Sau đó triển khai và ghi đè phương thức keyPressed, như những phương thức khác đã chỉ ra. Bây giờ bạn có thể nhấn enter từ bất kỳ trường nào trong khung để kích hoạt hành động của mình.
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER){
//perform action
}
}
public void keyReleased(KeyEvent e)
{
int key=e.getKeyCode();
if(e.getSource()==textField)
{
if(key==KeyEvent.VK_ENTER)
{
Toolkit.getDefaultToolkit().beep();
textField_1.requestFocusInWindow();
}
}
Để viết logic cho 'Enter nhấn' trong JTextField
, tốt hơn là giữ logic bên trong keyReleased()
khối thay vì keyTyped()
& keyPressed()
.
KeyListeners
Là mức độ quá thấp Swing
theo quan điểm của. Hãy sử dụng API dự định được sử dụng với Swing
:-)
Chỉ cần sử dụng mã này:
SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);