2012-10-11 108 views
1

我有一个简单的带有登录按钮的jFrame,我试图通过按下回车键来触发我的ActionPerformed事件。我不想先按“标签”来聚焦按钮,但只要有人按下回车键就会触发它。我在这里错过了什么?按任意文本框上的输入按钮返回按钮点击

编辑:如果它更容易做时,重点是“PasswordField”因为这是一个已经按下登录按钮

在请求之前焦点的最后一个字段,也可以触发事件。这里的loginGUI的全码:

package unive.facturatie.boundary; 

import java.awt.event.KeyEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JRootPane; 
import javax.swing.KeyStroke; 
import unive.facturatie.control.LoginManager; 

/** 
* 
* @author Forza 
*/ 
public class LoginGUI extends javax.swing.JFrame { 

JFrame frame = new JFrame(); 
JRootPane rootPane = frame.getRootPane(); 
//JButton inloggenButton = new JButton("Login"); 
//frame.getRootPane().setDefaultButton(inloggenButton); 

/** 
* Creates new form LoginGUI 
*/ 
public LoginGUI() { 
    frame.getRootPane().setDefaultButton(inloggenButton); 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(LoginGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 

    initComponents(); 
    this.setLocation(320, 160); 
} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    inlogLabel = new javax.swing.JLabel(); 
    gebruikersnaamLabel = new javax.swing.JLabel(); 
    wachtwoordLabel = new javax.swing.JLabel(); 
    gebruikersnaamTextField = new javax.swing.JTextField(); 
    wachtwoordPasswordField = new javax.swing.JPasswordField(); 
    inloggenButton = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    setTitle("Facturatie inlogscherm"); 

    inlogLabel.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N 
    inlogLabel.setText("Inloggen"); 

    gebruikersnaamLabel.setText("Gebruikersnaam:"); 

    wachtwoordLabel.setText("Wachtwoord:"); 

    wachtwoordPasswordField.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      wachtwoordPasswordFieldActionPerformed(evt); 
     } 
    }); 

    inloggenButton.setText("Inloggen"); 
    inloggenButton.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      inloggenButtonActionPerformed(evt); 
     } 
    }); 
    inloggenButton.addKeyListener(new java.awt.event.KeyAdapter() { 
     public void keyPressed(java.awt.event.KeyEvent evt) { 
      inloggenButtonKeyPressed(evt); 
     } 
    }); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(inlogLabel) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addComponent(inloggenButton) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(gebruikersnaamLabel) 
          .addComponent(wachtwoordLabel)) 
         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
          .addComponent(gebruikersnaamTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 171, Short.MAX_VALUE) 
          .addComponent(wachtwoordPasswordField))))) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(inlogLabel) 
      .addGap(18, 18, 18) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(gebruikersnaamLabel) 
       .addComponent(gebruikersnaamTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(wachtwoordLabel) 
       .addComponent(wachtwoordPasswordField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(inloggenButton) 
      .addContainerGap(25, Short.MAX_VALUE)) 
    ); 

    pack(); 
}// </editor-fold> 

private void inloggenButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    //frame.getRootPane().setDefaultButton(inloggenButton); 
    boolean isValid = false; 
    String username = gebruikersnaamTextField.getText(); 
    String password = wachtwoordPasswordField.getText(); 

    LoginManager loginManager = new LoginManager(); 
    isValid = loginManager.Inloggen(username, password); 
    if (isValid == true) 
    { 
     new MainGUI().setVisible(true); 
     dispose(); 
    } 
    else 
    { 
     JOptionPane.showMessageDialog(frame, "Gebruikersnaam en/of wachtwoord onjuist!", "Insane error", JOptionPane.ERROR_MESSAGE); 
    } 
}            

private void inloggenButtonKeyPressed(java.awt.event.KeyEvent evt) {           
     //frame.getRootPane().setDefaultButton(inloggenButton); 
     //inloggenButton.registerKeyboardAction(inloggenButton.getActionForKeyStroke(
     //KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false)), 
     //KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), 
     //JButton.WHEN_IN_FOCUSED_WINDOW); 

     //inloggenButton.registerKeyboardAction(inloggenButton.getActionForKeyStroke(
     //KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true)), 
     //KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true), 
     //JButton.WHEN_IN_FOCUSED_WINDOW); 

}           

private void wachtwoordPasswordFieldActionPerformed(java.awt.event.ActionEvent evt) { 
    // TODO add your handling code here: 
} 

// Variables declaration - do not modify 
private javax.swing.JLabel gebruikersnaamLabel; 
private javax.swing.JTextField gebruikersnaamTextField; 
private javax.swing.JLabel inlogLabel; 
private javax.swing.JButton inloggenButton; 
private javax.swing.JLabel wachtwoordLabel; 
private javax.swing.JPasswordField wachtwoordPasswordField; 
// End of variables declaration 
} 
+0

我假设你已经在'在keyPressed '函数,因为你实现了'KeyEvent'。如果你想要做的只是输入功能,你不需要。 – davidXYZ

+0

删除'inloggenButton.addKeyListener'。添加动作侦听器后您不需要它。 – davidXYZ

+0

在'initComponents()'之后执行'setDefaultButton()'。另外,你在哪里设置你的JFrame可见?你没有主要功能? – davidXYZ

回答

4

这是很简单的:

JFrame frame = new JFrame(); 
JButton btn = new JButton("Login"); 
frame.getRootPane().setDefaultButton(btn); 

就是这样。您不需要KeyListener,registerKeyBoardActiongetKeyStroke ...只需为您的按钮设置ActionEvent并将该按钮设置为默认值即可。按下当窗口打开时输入将激活默认按钮。

+0

我已经实现了..但不起作用。另外,如果我尝试完全像这样,我会得到'包框架不存在' – Forza

+0

这取决于您如何定义'JFrame'。你创建了一个实例还是扩展了它?你的代码不会显示你如何定义你的变量'rootPane'。请发布更完整的代码,显示您的框架的定义和部署。 – davidXYZ

+0

我已经将JFrame和JRootPane的创建添加到了问题中。这正是我现在所拥有的。但也许我需要告诉你,GUI是使用Netbeans GUI构建器构建的。该按钮已被定义,所以这就是为什么我不能说JButton btn = new JButton(“Login”);有 – Forza

2

这里的一个问题...

你的类从JFrame

public class LoginGUI extends javax.swing.JFrame { 

延伸,但那么你在其中创建另一个框架...

JFrame frame = new JFrame(); 
JRootPane rootPane = frame.getRootPane(); 

然后在constrcutor ,您将您的按钮注册为“假”参考

public LoginGUI() { 
    frame.getRootPane().setDefaultButton(inloggenButton); 

修订

这只是正常...

public class TestDefaultButton { 

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

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

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

    protected class TestForm extends JPanel { 

     private JButton myDefault; 
     private JTextField myText; 

     public TestForm() { 
      myDefault = new JButton("By Default"); 
      myDefault.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.showMessageDialog(TestForm.this, "By default"); 
       } 
      }); 

      myText = new JTextField(12); 

      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(8, 8, 8, 8); 

      add(myText, gbc); 

      gbc.gridy++; 
      add(myDefault, gbc); 
     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      SwingUtilities.getRootPane(this).setDefaultButton(myDefault); 
     } 
    } 
} 
+0

嗯好吧从来没有想过这个.. Thx的例子!明天我会试试这个;) – Forza

+1

@Forza:除了'setDefaultButton()',键绑定显示在[这里](http://stackoverflow.com/a/7457102/230513)。 – trashgod

+0

@trashgod使用一个类似的解决方案将escape键绑定到对话框上的“cancel”。很高兴知道我在做正确的事情:P – MadProgrammer

0
在我的项目

我使用NetBeans使用这个简单的代码:

private void txt_passwordKeyPressed(java.awt.event.KeyEvent evt) 
    {          
     if (evt.getKeyCode()==KeyEvent.VK_ENTER){ 
     btn_login.doClick(); 
     } 
    }