在Java中为我的程序添加一个简单的Enter键功能

时间:2014-03-26 09:49:19

标签: java eclipse swing keyboard enter

我有一个完整的Java程序。而且我想做出#34; Enter"输入密码时键工作。当我写这篇文章时,我只能点击按钮使其工作,所以我想在不改变所有代码的情况下添加这个简单的功能。

这就是我发帖的原因,因为我找到了几个链接,但是没有一个链接符合我的情况,知道我已经有了代码。我需要调整我在那里找到的东西:

Allowing the "Enter" key to press the submit button, as opposed to only using MouseClick http://tips4java.wordpress.com/2008/10/10/key-bindings/ http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html http://www.javaprogrammingforums.com/java-swing-tutorials/3171-jbutton-enter-key-keyboard-action.html http://www.rgagnon.com/javadetails/java-0253.html

事实上,他们都显示出来自nohting的解决方案并没有帮助我,因为我无法使用他们在我自己的程序中所做的事情。

Enter key

正如您所看到的,这是" OK"按钮我需要点击或按下#34;输入"

这是我的代码,您建议让Enter键工作吗?

import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame {

    private static final long serialVersionUID = 1L;

    private JPanel container = new JPanel();
    private JPasswordField p1 = new JPasswordField(4);
    private JLabel label = new JLabel("Enter Pin: ");
    private JButton b = new JButton("OK");


    public Main() {
        this.setTitle("NEEDS");
        this.setSize(300, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());
        container.add(p1);
        JPanel top = new JPanel();

        PlainDocument document =(PlainDocument)p1.getDocument();

        b.addActionListener(new BoutonListener());

        top.add(label);
        top.add(p1);
        p1.setEchoChar('*');
        top.add(b);


        document.setDocumentFilter(new DocumentFilter(){

            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                String string =fb.getDocument().getText(0, fb.getDocument().getLength())+text;

                if(string.length() <= 4)
                super.replace(fb, offset, length, text, attrs); //To change body of generated methods, choose Tools | Templates.
            }
        });

        this.setContentPane(top);
        this.setVisible(true);
    }

    class BoutonListener implements ActionListener {
        private final AtomicInteger nbTry = new AtomicInteger(0);
        ArrayList<Integer> pins = readPinsData(new File("bdd.txt"));

        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent e) {
            if (nbTry.get() > 2) {
                JOptionPane.showMessageDialog(null,
                        "Pin blocked due to 3 wrong tries");
                return;
            }
            final String passEntered=p1.getText().replaceAll("\u00A0", "");
            if (passEntered.length() != 4) {
                JOptionPane.showMessageDialog(null, "Pin must be 4 digits");
                return;
            }
            //JOptionPane.showMessageDialog(null, "Checking...");
            //System.out.println("Checking...");
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {
                    boolean authenticated = false;
                    ImageIcon imgAngry = new ImageIcon("angry.png");
                    ImageIcon imgHappy = new ImageIcon("happy.png");

                    if (pins.contains(Integer.parseInt(passEntered))) {
                        JOptionPane.showMessageDialog(null, "Pin correct", "Good Pin", JOptionPane.INFORMATION_MESSAGE, imgHappy);
                        authenticated = true;
                    }

                    if (!authenticated) {
                        JOptionPane.showMessageDialog(null, "Wrong Pin", "Wrong Pin", JOptionPane.INFORMATION_MESSAGE, imgAngry);
                        nbTry.incrementAndGet();
                    }
                    return null;
                }
            };
            worker.execute();
        }

    }

    // Reading bdd.txt file
    static public ArrayList<Integer> readPinsData(File dataFile) {
        final ArrayList<Integer> data=new ArrayList<Integer>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(dataFile));
            String line;
            try {
                while ((line = reader.readLine()) != null) {
                    try {
                        data.add(Integer.parseInt(line));
                    } catch (NumberFormatException e) {
                        e.printStackTrace();
                        System.err.printf("error parsing line '%s'\n", line);
                    }
                }
            } finally {
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("error:"+e.getMessage());
        }

        return data;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });

    }
}

5 个答案:

答案 0 :(得分:3)

JTextFieldJPasswordField继承自)仅为此功能提供ActionListener支持。

p1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        b.doClick(); // Re-use the Ok buttons ActionListener...
    }
});

请查看How to use text fields了解详情

答案 1 :(得分:2)

JTextField yourtexfield=new JTextField(8);

yourterxtfield.addActionListener(new ActionListener(){

       public void actionPerformed(ActionEvent e){
             // your code
      }
});

答案 2 :(得分:1)

我认为这段剪辑应该引导您,在您的课程中添加此代码:

    @Override
public void actionPerformed(ActionEvent e) {
    b.doClick();
}

答案 3 :(得分:1)

编辑:哦,抱歉。没有意识到你正在使用Swing / AWT。这是一项SWT功能,因此对您的问题没有任何帮助。

我使用TraverseListener来实现该行为。你可以试试这个:

        p1.addTraverseListener(new TraverseListener() {
        @Override
        public void keyTraversed(TraverseEvent e) {
            switch (e.detail) {
              case SWT.TRAVERSE_RETURN:
                doWhateverYourButtonClickDoesHere();
                break;
            }
        }
    });

答案 4 :(得分:-1)

充实my comment to @Mad's answer

  

[调用button.doClick()]不是最好的解决方案,因为它在几个视图之间引入了不必要的耦合。相反,使用一个Action并将其设置为textField和按钮

优点:

  • (如前所述):视图之间没有耦合
  • 实现登录逻辑的单一位置
  • 具有启用的概念,因此可以禁用 - 并且使用它所绑定的所有视图。登录锁定

原始(承担过多责任,强烈建议进一步分离)代码片段,接管

  • 抓住有效的针脚
  • 注册documentFilter
  • 验证/锁定登录

行动:

public static class LoginAction extends AbstractAction {
    private final AtomicInteger nbTry = new AtomicInteger(0);
    private ArrayList<Integer> pins = readPinsData(new File("bdd.txt"));
    private Document doc;

    public LoginAction(String login, AbstractDocument doc) {
        super(login);
        this.doc = doc;
        doc.setDocumentFilter(new DocumentFilter(){

            @Override
            public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
                String string =fb.getDocument().getText(0, fb.getDocument().getLength())+text;
                if(string.length() <= 4)
                    super.replace(fb, offset, length, text, attrs); 
            }
        });

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (nbTry.get() > 2) {
            JOptionPane.showMessageDialog(null,
                    "Pin blocked due to 3 wrong tries");
            setEnabled(false);
            return;
        }
        String passEntered = null;
        try {
            passEntered = doc.getText(0, doc.getLength()).replaceAll("\u00A0", "");
        } catch (BadLocationException e1) {
            e1.printStackTrace();
        }
        if (passEntered.length() != 4) {
            JOptionPane.showMessageDialog(null, "Pin must be 4 digits");
            return;
        }
        boolean authenticated = false;
        ImageIcon imgAngry = new ImageIcon("angry.png");
        ImageIcon imgHappy = new ImageIcon("happy.png");

        if (pins.contains(Integer.parseInt(passEntered))) {
            JOptionPane.showMessageDialog(null, "Pin correct", "Good Pin", JOptionPane.INFORMATION_MESSAGE, imgHappy);
            authenticated = true;
        }

        if (!authenticated) {
            JOptionPane.showMessageDialog(null, "Wrong Pin", "Wrong Pin", JOptionPane.INFORMATION_MESSAGE, imgAngry);
            nbTry.incrementAndGet();
        }

    }

}

这是用法:

PlainDocument document =(PlainDocument)passwordField.getDocument();
LoginAction action = new LoginAction("OK", document);
passwordField.setAction(action);
loginButton.setAction(action);