เป็นไปได้ไหมที่จะตรวจจับเมื่อมีคนกดEnterขณะพิมพ์ JTextField ใน java? โดยไม่ต้องสร้างปุ่มและตั้งเป็นค่าเริ่มต้น.
เป็นไปได้ไหมที่จะตรวจจับเมื่อมีคนกดEnterขณะพิมพ์ JTextField ใน java? โดยไม่ต้องสร้างปุ่มและตั้งเป็นค่าเริ่มต้น.
คำตอบ:
JTextField
ถูกออกแบบมาเพื่อใช้ActionListener
เช่นเดียวกับJButton
มี ดูaddActionListener()
วิธีการของJTextField
.
ตัวอย่างเช่น:
Action action = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
System.out.println("some action");
}
};
JTextField textField = new JTextField(10);
textField.addActionListener( action );
ตอนนี้เหตุการณ์จะเริ่มทำงานเมื่อใช้Enterคีย์
นอกจากนี้ประโยชน์เพิ่มเติมคือคุณสามารถแบ่งปันผู้ฟังด้วยปุ่มแม้ว่าคุณจะไม่ต้องการให้ปุ่มเป็นปุ่มเริ่มต้นก็ตาม
JButton button = new JButton("Do Something");
button.addActionListener( action );
หมายเหตุตัวอย่างนี้ใช้Action
ซึ่งใช้ActionListener
เนื่องจากAction
เป็น API รุ่นใหม่ที่มีคุณลักษณะเพิ่มเติม ตัวอย่างเช่นคุณสามารถปิดการใช้งานAction
ซึ่งจะปิดใช้งานเหตุการณ์ทั้งในฟิลด์ข้อความและปุ่ม
JTextField function=new JTextField(8);
function.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//statements!!!
}});
สิ่งที่คุณต้องทำคือ addActionListener ไปที่ JTextField เหมือนข้างบน! หลังจากที่คุณกดEnterการกระทำจะดำเนินการตามที่คุณต้องการในคำสั่ง!
เพิ่มเหตุการณ์สำหรับKeyPressed
.
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
// Enter was pressed. Your code goes here.
}
}
KeyListeners
มีข้อบกพร่องมากมายซึ่งได้รับการดูแลในระดับที่มากขึ้น KeyBindings
เช่นเกี่ยวข้องกับโฟกัสคัดลอก / วางที่เกี่ยวข้องและอื่น ๆ อีกมากมาย เป็นสิ่งที่ควรหลีกเลี่ยงสำหรับงานเล็กน้อยเช่นตามที่ถามใน OP
คุณต้องการทำสิ่งนี้หรือไม่?
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();
}
}
});
ขั้นแรกให้เพิ่มคำสั่งการดำเนินการบน JButton หรือ JTextField โดย:
JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");
จากนั้นเพิ่ม ActionListener ทั้ง JTextField และ JButton
JButton.addActionListener(listener);
JTextField.addActionListener(listener);
หลังจากนั้นให้คุณเขียนการใช้งาน ActionListener
@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
}
}
คำตอบอื่น ๆ (รวมถึงคำตอบที่ยอมรับ) นั้นดี แต่ถ้าคุณใช้ Java8 อยู่แล้วคุณสามารถทำสิ่งต่อไปนี้ (ด้วยวิธีที่สั้นกว่าและใหม่กว่า):
textField.addActionListener(
ae -> {
//dostuff
}
);
ตามคำตอบที่ยอมรับคุณสามารถตอบสนองด้วย an ActionListener
ซึ่งจับคีย์ Enter
อย่างไรก็ตามแนวทางของฉันใช้ประโยชน์จากแนวคิดการทำงานซึ่งนำมาใช้ใน Java 8
หากคุณต้องการใช้การกระทำเดียวกันเช่นปุ่มและ JTextField คุณสามารถทำสิ่งต่อไปนี้:
ActionListener l = ae -> {
//do stuff
}
button.addActionListener(l);
textField.addActionListener(l);
หากต้องการคำอธิบายเพิ่มเติมโปรดแจ้งให้เราทราบ!
หากคุณต้องการตั้งค่าการทำงานของปุ่มเริ่มต้นในการป้อน JTextField คุณต้องทำสิ่งนี้:
//put this after initComponents();
textField.addActionListener(button.getActionListeners()[0]);
มันคือ [0] เนื่องจากปุ่มสามารถมีการดำเนินการได้มากมาย แต่โดยปกติจะมีเพียงปุ่มเดียว (ActionPerformed)
สำหรับแต่ละช่องข้อความในเฟรมของคุณให้เรียกใช้เมธอด addKeyListener จากนั้นใช้งานและแทนที่เมธอด keyPressed ตามที่คนอื่นระบุ ตอนนี้คุณสามารถกด Enter จากช่องใดก็ได้ในเฟรมเพื่อเปิดใช้งานการกระทำของคุณ
@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();
}
}
ตรรกะการเขียน 'Enter กด' ในJTextField
มันจะดีกว่าที่จะให้ตรรกะภายในkeyReleased()
บล็อกแทนและkeyTyped()
keyPressed()
KeyListeners
อยู่ในระดับที่ต่ำเกินไปจากSwing
มุมมองของใช้ API ที่ตั้งใจจะให้ ใช้กับSwing
:-)
เพียงใช้รหัสนี้:
SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);