2012-12-05 20 views
35

'u kullanmak yerine, gönder düğmesine basmak için izin vermek Swing sınıfını şimdi ve bununla ilgili her şeyi öğreniyorum. Bir araya getirdiğim bu oyuncak programını aldım ve daha sonra "Girmiş (Adınız)" mesajıyla bir JOptionPane sunuyor. Kullandığım gönderme butonu sadece tıklanabilir, ancak Enter tuşu ile de çalışmak istiyorum. Kullanmakta olduğum Java kitabında (Eventful Java, Bruce Danyluk ve Murtagh) önerildiği gibi bir KeyListener eklemeye çalıştım. enter image description here"Enter" tuşuna, sadece MouseClick

NamePrompt

Bu benim kodudur:

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class NamePrompt extends JFrame{ 


    private static final long serialVersionUID = 1L; 

    String name; 

    public NamePrompt(){ 

     setLayout(new BorderLayout()); 

     JLabel enterYourName = new JLabel("Enter Your Name Here:"); 
     JTextField textBoxToEnterName = new JTextField(21); 
     JPanel panelTop = new JPanel(); 
     panelTop.add(enterYourName); 
     panelTop.add(textBoxToEnterName); 

     JButton submit = new JButton("Submit"); 
     submit.addActionListener(new SubmitButton(textBoxToEnterName)); 
     submit.addKeyListener(new SubmitButton(textBoxToEnterName)); 
     JPanel panelBottom = new JPanel(); 
     panelBottom.add(submit); 

     //Add panelTop to JFrame 
     add(panelTop, BorderLayout.NORTH); 
     add(panelBottom, BorderLayout.SOUTH); 

     //JFrame set-up 
     setTitle("Name Prompt Program"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 


    } 



    public static void main(String[] args) { 
     NamePrompt promptForName = new NamePrompt(); 
     promptForName.setVisible(true); 
    } 


} 

Ve bu ActionListener, KeyListener sınıftır:

import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 


public class SubmitButton implements ActionListener, KeyListener { 

    JTextField nameInput; 


    public SubmitButton(JTextField textfield){ 
     nameInput = textfield; 
    } 

    @Override 
    public void actionPerformed(ActionEvent submitClicked) { 

     Component frame = new JFrame(); 
     JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText()); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode()==KeyEvent.VK_ENTER){ 
      System.out.println("Hello"); 
     } 
     Component frame = new JFrame(); 
     JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText()); 

    } 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 

    } 
} 

cevap

88

Bunun basit bir hile vardır. Eğer tüm bu düğmeleri ile çerçeve inşa sonra bunu:

her çerçeve için
frame.getRootPane().setDefaultButton(submitButton); 

, otomatik olarak dinleyecek varsayılan bir düğme ayarlayabilirsiniz Enter tuşuna (ve belki başka olay ı farkında değilim) . Bu kareye enter tuşuna bastığınızda, ActionListeners onların actionPerformed() yöntemini çağırılacaktır.


Ve bildiğim kadarıyla gördüğünüz gibi sizin koduyla sorun varsa vücut bunu koymadı çünkü iletişim, bir tuşa basın her zaman açılır olmasıdır. Bu değiştirmeyi deneyin:

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode()==KeyEvent.VK_ENTER){ 
     System.out.println("Hello"); 

     JOptionPane.showMessageDialog(null , "You've Submitted the name " + nameInput.getText()); 
    } 

} 

GÜNCELLEME: Kuralların sorunun ne buldum. TextField yerine, anahtar dinleyiciyi Gönder düğmesine ekliyorsunuz. Bu kodunuzu değiştirin:

SubmitButton listener = new SubmitButton(textBoxToEnterName); 
textBoxToEnterName.addActionListener(listener); 
submit.addKeyListener(listener); 
+1

Çalışır! Bunun neden işe yaradığını açıklayabilir misin? Ayrıca, Boşluk tuşu ile basılacak Gönder düğmesini istediysem? (yani, birden fazla düğme varsa) – CodyBugstein

+0

Yeterince temizleyin? Yardım ettiğim için sevindim :) –

+0

Aslında, çözümünüzü uygulamadan önce, iletişim kutusu herhangi bir tuşa (hatta Enter'a) ulaşmadı. Yanlış olan neydi? – CodyBugstein

12

Bunu girmek cevap sağlayacak bir varsayılan düğme, ayarlamak için üst düzey konteynerler kök bölmesini kullanabilirsiniz.

SwingUtilities.getRootPane(submitButton).setDefaultButton(submitButton); 

Bu, elbette, geçerli bir kaba düğmesi ekledik varsayar;)

Bu JRootPane#setDefaultButton ve anahtar bağlamaları API

kullanarak temel bir örnektir

GÜNCELLENDİ

public class DefaultButton { 

    public static void main(String[] args) { 
     new DefaultButton(); 
    } 

    public DefaultButton() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private JButton button; 
     private JLabel label; 
     private int count; 

     public TestPane() { 

      label = new JLabel("Press the button"); 
      button = new JButton("Press me"); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridy = 0; 
      add(label, gbc); 
      gbc.gridy++; 
      add(button, gbc); 
      gbc.gridy++; 
      add(new JButton("No Action Here"), gbc); 

      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        doButtonPressed(e); 
       } 

      }); 

      InputMap im = button.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
      ActionMap am = button.getActionMap(); 

      im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaced"); 
      am.put("spaced", new AbstractAction() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        doButtonPressed(e); 
       } 

      }); 

     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      SwingUtilities.getRootPane(button).setDefaultButton(button); 
     } 

     protected void doButtonPressed(ActionEvent evt) { 
      count++; 
      label.setText("Pressed " + count + " times"); 
     } 

    } 

} 

Elbette, odaklanmış bileşenin söz konusu önemli olayı tüketmediğini varsayar (alanı tüketen ikinci düğme gibi veya tuşları

0
switch(KEYEVENT.getKeyCode()){ 
     case KeyEvent.VK_ENTER: 
      // I was trying to use case 13 from the ascii table. 
      //Krewn Generated method stub... 
      break; 
} 
+2

Bu kod bloğu soruyu yanıtlayabilirken, bunun nedenini açıklamak için daha iyi bir yanıt olabilir. – DavidPostill

-2

yapmak istiyorum kolay yolu ...

textBoxToEnterName.addActionListener(new ActionListener() 

girin ... Eğer sadece bu bir çerçeve olmadan

public void actionPerformed(ActionEvent event) { 
    if (event.getSource()==textField){ 
     textButton.doClick(); 
    } 
    else if (event.getSource()==textButton) { 
     //do something 
    } 
} 
+1

Hayır, aslında oradan ne yapacağımı bilmiyorum. –

1

ActionListener sınıfındaki dan ne yapacağını bilir benim için çalışıyor:

JTextField tf = new JTextField(20); 
tf.addKeyListener(new KeyAdapter() { 

    public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode()==KeyEvent.VK_ENTER){ 
     SwingUtilities.getWindowAncestor(e.getComponent()).dispose(); 
    } 
    } 
}); 
String[] options = {"Ok", "Cancel"}; 
int result = JOptionPane.showOptionDialog(
    null, tf, "Enter your message", 
    JOptionPane.OK_CANCEL_OPTION, 
    JOptionPane.QUESTION_MESSAGE, 
    null, 
    options,0); 

message = tf.getText(); 
0

ekleyebilir burada

0

bu iyi değil biliyorum Bunu yapmanın yolu, ancak söz konusu düğmeyi, olayları, anahtarı, yazılan tuşa sağ tıklayın. Bu, bunu yapmanın basit bir yoludur, ancak herhangi bir tuşa tepki verir