我有一个完整的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的解决方案并没有帮助我,因为我无法使用他们在我自己的程序中所做的事情。
正如您所看到的,这是" 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();
}
});
}
}
答案 0 :(得分:3)
JTextField
(JPasswordField
继承自)仅为此功能提供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)
我使用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和按钮
优点:
原始(承担过多责任,强烈建议进一步分离)代码片段,接管
行动:
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);