java - 如何在 Java 中限制 JPasswordField 中的位数?

标签 java swing security passwords limit

我的 Java 代码在 Eclipse 中运行,但我需要添加一些功能。

首先,如何限制用户可以输入的位数? 实际上我有一个 JPasswordField 可以让一个人输入密码,我希望这个 JPasswordField 最多限制为 4 位数字。那么如何在输入4位后立即停止输入呢?

那么,我该如何调整 JPassword 框的大小呢?有没有办法像 JTextField 一样修改它?因为我的行“p1.setPreferredSize(new Dimension(100, 25));”似乎并没有真正让我修改框的大小。

enter image description here

如您所见,JPassworldField 框有一个默认大小,我不知道如何轻松修改它。

这是我的代码:

package codePin;

import java.io.*;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.*;
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());
        JPanel top = new JPanel();
        p1.setPreferredSize(new Dimension(100, 25)); //How to really modifiy this ?

        b.addActionListener(new BoutonListener());

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


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

    class BoutonListener implements ActionListener {
        private final AtomicInteger nbTry = new AtomicInteger(0);

        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent e) {
            if (nbTry.get() > 2) {
                JOptionPane.showMessageDialog(null,
                        "Pin blocked due to 3 wrong tries");
                return;
            }
            if (p1.getText().replaceAll("\u00A0", "").length() != 4) {
                // System.out.println("Pin must be 4 digits");
                JOptionPane.showMessageDialog(null, "Ping must be 4 digits");
                return;
            }
            System.out.println("Checking...");
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {
                    boolean authenticated = false;
                    ArrayList<Integer> pins = new ArrayList<Integer>();
                    readPinsData(new File("bdd.txt"), pins);
                    String[] thePins = new String[pins.size()];
                    for (int i = 0; i < thePins.length; i++) {
                        thePins[i] = pins.get(i).toString();
                    }
                    String passEntered = String.valueOf(p1);
                    for (String thePin : thePins) {
                        if (passEntered.equals(thePin)
                                && p1.getText().length() == 4) {
                            System.out.println(":)");
                            authenticated = true;
                            break;
                        }
                    }
                    if (!authenticated) {
                        System.out.println(":(");
                        nbTry.incrementAndGet();
                    }
                    return null;
                }
            };
            worker.execute();
        }

    }

    // Accessing pins Bdd file
    static public boolean readPinsData(File dataFile, ArrayList<Integer> data) {
        boolean err = false;
        try {
            Scanner scanner = new Scanner(dataFile);
            String line;
            while (scanner.hasNext()) {
                line = scanner.nextLine();
                try {
                    data.add(Integer.parseInt(line));
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                    err = true;
                }
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            err = true;
        }

        return err;
    }

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

    }
}

有什么想法吗?谢谢。

佛罗伦萨

这是我用 nachokk 的解决方案编辑的代码:

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());
        JPanel top = new JPanel();

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

        b.addActionListener(new BoutonListener());

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


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


        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.
            }



        });
        container.add(p1);
    }

    class BoutonListener implements ActionListener {
        private final AtomicInteger nbTry = new AtomicInteger(0);

        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent e) {
            if (nbTry.get() > 2) {
                JOptionPane.showMessageDialog(null,
                        "Pin blocked due to 3 wrong tries");
                return;
            }
            if (p1.getText().replaceAll("\u00A0", "").length() != 4) {
                // System.out.println("Pin must be 4 digits");
                JOptionPane.showMessageDialog(null, "Ping must be 4 digits");
                return;
            }
            System.out.println("Checking...");
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                @Override
                protected Void doInBackground() throws Exception {
                    boolean authenticated = false;
                    ArrayList<Integer> pins = new ArrayList<Integer>();
                    readPinsData(new File("bdd.txt"), pins);
                    String[] thePins = new String[pins.size()];
                    for (int i = 0; i < thePins.length; i++) {
                        thePins[i] = pins.get(i).toString();
                    }
                    String passEntered = String.valueOf(p1);
                    for (String thePin : thePins) {
                        if (passEntered.equals(thePin)
                                && p1.getText().length() == 4) {
                            System.out.println(":)");
                            authenticated = true;
                            break;
                        }
                    }
                    if (!authenticated) {
                        System.out.println(":(");
                        nbTry.incrementAndGet();
                    }
                    return null;
                }
            };
            worker.execute();
        }

    }

    // Fonction permettant d'accéder/lire notre BDD de pins (fichier .txt)
    static public boolean readPinsData(File dataFile, ArrayList<Integer> data) {
        boolean err = false;
        try {
            Scanner scanner = new Scanner(dataFile);
            String line;
            while (scanner.hasNext()) {
                line = scanner.nextLine();
                try {
                    data.add(Integer.parseInt(line));
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                    err = true;
                }
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            err = true;
        }

        return err;
    }

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

    }
}

最佳答案

How can I play with the size of the JPassword box ? Is there a way to modify it just like a JTextField for example ? Because my line "p1.setPreferredSize(new Dimension(100, 25));" does not seem to really let me modify the size of the box.

不要使用 setPrefferedSize() 而是使用这个构造函数 JPasswordField(int col) .在这里阅读更多相关信息 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

How to limit the number of digits that can be entered by the user ? Actually I have a JPasswordField that let a person enter a pin Code, and I would like this JPasswordField limited to 4 digits maximum. So how to stop the input as soon as 4 digits are entered ?

对于限制输入,您可以使用 DocumentFilter,如下例所示。

 public class JPasswordFieldTest {

    private JPanel panel;

    public JPasswordFieldTest() {
        panel = new JPanel();
        //set horizontal gap
        ((FlowLayout) panel.getLayout()).setHgap(2);

        panel.add(new JLabel("Enter pin :"));
        JPasswordField passwordField = new JPasswordField(4);
        PlainDocument document = (PlainDocument) passwordField.getDocument();
        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.
                }
            }

        });
        panel.add(passwordField);
        JButton button = new JButton("OK");
        panel.add(button);

    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI("Password Example");
            }
        });

    }

    private static void createAndShowGUI(String str) {
        JFrame frame = new JFrame(str);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPasswordFieldTest test = new JPasswordFieldTest();
        frame.add(test.panel);
        frame.pack();
        frame.setVisible(true);
    }

}

enter image description here

关于java - 如何在 Java 中限制 JPasswordField 中的位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637587/

相关文章:

security - 如何在 Java EE 7 中保护 Websocket 服务器

java - NPE 未发生或未被 Servlet 捕获

java - 使用 JFileChooser 允许 Swing 用户指定输出位置

java - 内容从 JPanel 的 vCenter 开始

excel - 复选框 "Trust access to the VBA Project Model"是什么意思?

c# - ASP.NET MVC AntiForgeryToken 和 AdSense 爬虫登录

Java:对象数组中的对象数组

java - 永久更新 tensorflow-java 中的变量(在推理期间)

Java - Java 中的内存泄漏有何危害?它怎么可能被用于不良目的呢?

java - 访问图像的像素