Как использовать JProgressBar в качестве измерителя надежности пароля, он должен менять цвет и значение по мере ввода - PullRequest
2 голосов
/ 20 августа 2011

Я разрабатываю логику для создания хорошей проверки надежности пароля для формы входа, но проблема в том, как выразить надежность введенного пароля? Я использую Java, и я использую этот подход:

  1. , используя JProgressBar в качестве измерителя силы, он меняет цвет при потере фокуса с JPasswordField или при отпускании ключа в JPasswordField (это дает более быстрый отклик).

  2. Могу ли я использовать Swing Worker, чтобы сделать его лучше? Я никогда не использовал его, так что кто-нибудь может мне помочь с этим, если это лучший способ.

Пожалуйста, прости меня за длинные предложения.

См. Изображение ниже:


This image below shows what I want to achieve

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Та же идея, что и у mKorbel, но с цветом:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PasswordChecker extends JPanel {
   private static final Color[] PB_COLORS = {Color.red, Color.yellow, Color.green};
   private static final int MAX_LENGTH = 15;
   private JPasswordField pwField1 = new JPasswordField(10);
   private JPasswordField pwField2 = new JPasswordField(10);
   private JProgressBar progBar = new JProgressBar();
   private int ins = 10;

   public PasswordChecker() {
      pwField1.addFocusListener(new FocusAdapter() {
         public void focusLost(FocusEvent e) {
            pwField1FocusLost(e);
         }
      });

      setLayout(new GridBagLayout());

      GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1.0, 10,
               GridBagConstraints.WEST, GridBagConstraints.BOTH, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(new JLabel("Password"), gbc);

      gbc = new GridBagConstraints(1, 0, 1, 1, 1.0, 10,
               GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(pwField1, gbc);

      gbc = new GridBagConstraints(0, 1, 1, 1, 1.0, 10,
               GridBagConstraints.WEST, GridBagConstraints.BOTH, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(new JLabel("Confirm Password"), gbc);

      gbc = new GridBagConstraints(1, 1, 1, 1, 1.0, 10,
               GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(pwField2, gbc);

      gbc = new GridBagConstraints(0, 2, 1, 1, 1.0, 10,
               GridBagConstraints.WEST, GridBagConstraints.BOTH, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(new JLabel("Strength"), gbc);

      gbc = new GridBagConstraints(1, 2, 1, 1, 1.0, 10,
               GridBagConstraints.EAST, GridBagConstraints.BOTH, 
               new Insets(ins, ins, ins, ins), 0, 0);
      add(progBar, gbc);
   }

   private void pwField1FocusLost(FocusEvent e) {
      // simple check, just checks length
      char[] pw = pwField1.getPassword();
      int value = (pw.length * 100) / MAX_LENGTH;
      value = (value > 100) ? 100 : value;
      progBar.setValue(value);

      int colorIndex = (PB_COLORS.length * value) / 100;
      progBar.setForeground(PB_COLORS[colorIndex]);
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("Password Checker");
      frame.getContentPane().add(new PasswordChecker());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
3 голосов
/ 20 августа 2011

нет SwingWorker не заставляет меня думать в этом случае, это просто и примерно DocumentListener

ВНИМАНИЕ: этот пример не о том, как проверить надежность пароля, просто как прослушать изменения из JPasswordField и перенаправить вывод на JProgressBar

enter image description hereenter image description hereenter image description here

import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class TextLabelMirror {

    private JPanel mainPanel = new JPanel();
    private JPasswordField field = new JPasswordField(20);
    private JLabel label = new JLabel();
    private JLabel labelLength = new JLabel();
    private JProgressBar progressBar = new JProgressBar(0, 20);

    public TextLabelMirror() {
        field.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void changedUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                updateLabel(e);
            }

            private void updateLabel(DocumentEvent e) {
                String text = field.getText();//just example getText() is Depreciated !!!
                label.setText(text);
                labelLength.setText(" Psw Lenght -> " + text.length());
                if (text.length() < 1) {
                    progressBar.setValue(0);
                } else {
                    progressBar.setValue(text.length());
                }
            }
        });
        mainPanel.setLayout(new GridLayout(4, 0, 10, 0));
        mainPanel.add(field);
        mainPanel.add(label);
        mainPanel.add(labelLength);
        mainPanel.add(progressBar);
    }

    public JComponent getComponent() {
        return mainPanel;
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("Password Strength Checker");
        frame.getContentPane().add(new TextLabelMirror().getComponent());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}
...