【问题标题】:Focus on Keylistener专注于 Keylistener
【发布时间】:2013-12-16 02:33:22
【问题描述】:

所以我得到的是我很想尝试制作一个小的登录小程序。我正在为此使用 Java Windowsbuilder,以使其更容易。我希望代码不要乱七八糟,因为我只是一个初学者。

我遇到的问题是,我的 JButton“登录”仅在选中选项卡或第一次单击它时才注册一个键事件。我想要的是我总是可以通过按“ENTER”键来使用这个按钮。

希望你们解决我的问题:)

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

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

import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import org.eclipse.wb.swing.FocusTraversalOnArray;
import java.awt.Component;
import java.awt.event.KeyAdapter;

public class nummer1 extends JFrame{

private JPanel contentPane;
public static nummer1 theFrame;
private JTextField textFieldUsername;
private JTextField textFieldPass;
private nummer1  me;
private JLabel lblCheck;
private String password = "test", username = "test";

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                nummer1 frame = new nummer1();
                nummer1.theFrame = frame;
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
public void Check(){
    String Pass = textFieldPass.getText();
    String Username = textFieldUsername.getText();

    System.out.println(Pass);

    if (Pass.equals(password) && Username.equals(username)){

        lblCheck.setText("Correct Login");

    }else{

        lblCheck.setText("Invalid username or password");

    }
}



/**
 * Create the frame.
 */
public nummer1() {
    me = this;

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 356, 129);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);


    JLabel lblUsername = new JLabel("Username:");
    lblUsername.setBounds(10, 11, 61, 14);
    contentPane.add(lblUsername);

    JLabel lblPassword = new JLabel("Password:");
    lblPassword.setBounds(10, 36, 61, 14);
    contentPane.add(lblPassword);

    textFieldUsername = new JTextField();
    textFieldUsername.setBounds(81, 8, 107, 20);
    contentPane.add(textFieldUsername);
    textFieldUsername.setColumns(10);
    me.textFieldUsername = textFieldUsername;

    textFieldPass = new JTextField();
    textFieldPass.setBounds(81, 33, 107, 20);
    contentPane.add(textFieldPass);
    textFieldPass.setColumns(10);
    me.textFieldPass = textFieldPass;

    JButton btnLogin = new JButton("Login");
    contentPane.requestFocusInWindow();
    btnLogin.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                me.Check();
                System.out.println("hi");
            }
        }
    });

    btnLogin.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            me.Check();
        }
    });
    btnLogin.setBounds(198, 7, 89, 23);
    contentPane.add(btnLogin);

    JLabel lblCheck = new JLabel("");
    lblCheck.setHorizontalAlignment(SwingConstants.TRAILING);
    lblCheck.setBounds(10, 65, 264, 14);
    contentPane.add(lblCheck);
    me.lblCheck = lblCheck;
    contentPane.setFocusTraversalPolicy(new FocusTraversalOnArray(new         
            Component[]{lblUsername, lblPassword, textFieldUsername, textFieldPass,   btnLogin, lblCheck}));

}
}

谢谢埃米尔!

【问题讨论】:

    标签: java swing jbutton keylistener setfocus


    【解决方案1】:

    我想要的是我总是可以通过按“ENTER”键来使用按钮

    听起来您想让“登录”按钮成为对话框的默认按钮。

    有关问题和解决方案,请参阅Enter Key and Button

    【讨论】:

      【解决方案2】:

      使用面板时,除非面板可聚焦,否则 KeyListener 将不起作用。您可以做的是使用面板的 InputMap 和 ActionMap 对 ENTER 键进行 KeyBinding。

      public class Sample extends JPanel{
          //Code
          Sample() {
                //More code
                this.getInputMap().put(KeyStroke.getKeyStroke((char)KeyEvent.VK_ENTER), "Enter" );
                this.getActionMap().put("Enter", new EnterAction());
          }
          private class EnterAction extends AbstractAction(){
              @Override
              public void ActionPerformed(ActionEvent e){
                  //Acion
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-22
        • 2014-07-04
        相关资源
        最近更新 更多