ตรวจจับกด Enter ใน JTextField


104

เป็นไปได้ไหมที่จะตรวจจับเมื่อมีคนกดEnterขณะพิมพ์ JTextField ใน java? โดยไม่ต้องสร้างปุ่มและตั้งเป็นค่าเริ่มต้น.

คำตอบ:


169

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ซึ่งจะปิดใช้งานเหตุการณ์ทั้งในฟิลด์ข้อความและปุ่ม


1
เห็นด้วย โซลูชันที่หรูหรากว่าของฉันในกรณีทั่วไป
Kos

@camickr เป็นผู้เชี่ยวชาญด้านการแกว่งของ Java
Mohamed Iqzas

23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

สิ่งที่คุณต้องทำคือ addActionListener ไปที่ JTextField เหมือนข้างบน! หลังจากที่คุณกดEnterการกระทำจะดำเนินการตามที่คุณต้องการในคำสั่ง!


17

เพิ่มเหตุการณ์สำหรับKeyPressed.

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 

-1 :( KeyListeners อยู่ในระดับที่ต่ำเกินไปจากมุมมองของ Swing ใช้ API ที่ตั้งใจจะใช้กับ Swing :-)
nIcE cOw

1
@nIcEcOw KeyListeners เป็นระดับที่ต่ำเกินไปจากมุมมองของ Swing : จำเป็นต้องอ้างอิง
guido

2
@ ᴳᵁᴵᴰᴼ: สิ่งที่จัดทำเป็นเอกสารไว้เป็นอย่างดีสามารถพบได้ที่บทแนะนำอย่างเป็นทางการของKeyBindingsแม้ว่าจะเป็นคำตอบที่ดีมากใน stackoverflow แต่ก็ครอบคลุมแง่มุมเดียวกันด้วย :-)
nIcE cOw

1
@nIcEcOw นั่นคือหน้าเอกสารที่ฉันคิดไว้ ผมพบว่าแตกต่างกันมากระหว่างการแนะนำเพื่อต้องการผูกสำหรับทางลัดและการกระทำเพียงใช้ฟังสำหรับการควบคุมแป้นพิมพ์ที่ระดับต่ำและไม่ได้ใช้เพราะมันเป็น API หน้าเอกสารไม่ได้เป็นภาพขาวดำเช่นกัน
guido

1
@ ᴳᵁᴵᴰᴼ: KeyListenersมีข้อบกพร่องมากมายซึ่งได้รับการดูแลในระดับที่มากขึ้น KeyBindingsเช่นเกี่ยวข้องกับโฟกัสคัดลอก / วางที่เกี่ยวข้องและอื่น ๆ อีกมากมาย เป็นสิ่งที่ควรหลีกเลี่ยงสำหรับงานเล็กน้อยเช่นตามที่ถามใน OP
nIcE cOw

9

คุณต้องการทำสิ่งนี้หรือไม่?

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();
            }
        }

    });

1

ขั้นแรกให้เพิ่มคำสั่งการดำเนินการบน 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
    }
}

1

คำตอบอื่น ๆ (รวมถึงคำตอบที่ยอมรับ) นั้นดี แต่ถ้าคุณใช้ Java8 อยู่แล้วคุณสามารถทำสิ่งต่อไปนี้ (ด้วยวิธีที่สั้นกว่าและใหม่กว่า):

textField.addActionListener(
    ae -> {
        //dostuff
    }
);

ตามคำตอบที่ยอมรับคุณสามารถตอบสนองด้วย an ActionListenerซึ่งจับคีย์ Enter

อย่างไรก็ตามแนวทางของฉันใช้ประโยชน์จากแนวคิดการทำงานซึ่งนำมาใช้ใน Java 8

หากคุณต้องการใช้การกระทำเดียวกันเช่นปุ่มและ JTextField คุณสามารถทำสิ่งต่อไปนี้:

ActionListener l = ae -> {
    //do stuff
}

button.addActionListener(l);
textField.addActionListener(l);

หากต้องการคำอธิบายเพิ่มเติมโปรดแจ้งให้เราทราบ!


0

หากคุณต้องการตั้งค่าการทำงานของปุ่มเริ่มต้นในการป้อน JTextField คุณต้องทำสิ่งนี้:

//put this after initComponents();

textField.addActionListener(button.getActionListeners()[0]);

มันคือ [0] เนื่องจากปุ่มสามารถมีการดำเนินการได้มากมาย แต่โดยปกติจะมีเพียงปุ่มเดียว (ActionPerformed)


0

สำหรับแต่ละช่องข้อความในเฟรมของคุณให้เรียกใช้เมธอด addKeyListener จากนั้นใช้งานและแทนที่เมธอด keyPressed ตามที่คนอื่นระบุ ตอนนี้คุณสามารถกด Enter จากช่องใดก็ได้ในเฟรมเพื่อเปิดใช้งานการกระทำของคุณ

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

-2
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()


1
-1 :( สำหรับการทำซ้ำข้อผิดพลาดเดิมอีกครั้งซึ่งได้รับการโหวตลดลงในคำตอบก่อนหน้าพร้อมกับเหตุผลที่ระบุไว้สำหรับคำตอบเดียวกันนั้นKeyListenersอยู่ในระดับที่ต่ำเกินไปจากSwingมุมมองของใช้ API ที่ตั้งใจจะให้ ใช้กับSwing :-)
nIcE cOw

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.