Frage zu "new JPasswordField( 10 )"

vfl_freak

Premium-User
Hallo zusammen,

steh' leider gerade auf dem Schlauch - ich versuche gerade eine Maske mit zwei JPasswordFields zu basteln ...
Java:
public JPasswordField fPW_1 = new JPasswordField( 10 );
public JPasswordField fPW_2 = new JPasswordField( 10 );

Jetzt sagt mir die API, das der übergebenen Integer-Wert "die Anzahl der Spalten" darstellt, was aber scheinbar, wie ich vorhin feststellen musste, mitnichten die maximale Anzahl einzugebender Zeichen ist ...
Frage (1) : von was für Spalten ist denn hier die Rede?

Ich habe dann versucht, die Länge über einen KeyEventListener zu regeln :
Java:
void fPW_1_keyReleased( KeyEvent e ) 
{
    if( fPW_1.getPassword().length == 10 ) 
    {
         Toolkit.getDefaultToolkit().beep();

         // #####################################################################
         // hier möchte ich die weitere Eingabe unterbinden oder - besser noch - gleich mit dem Cursor zu fPW_2 springen !!
         // #####################################################################
    }
} // fPW_1_keyReleased

Frage (2) :
siehe Kommentar !

Danke und Gruß
Klaus
 
Zuletzt bearbeitet:
Hi,
also eigentlich sollte die Zahl im Konstruktor schon die Begrenzung der Passwordlänge beschränken. Außer ich verstehe hier irgendetwas nicht richtig.

Du kannst die Passwordlänge aber auch noch so beschränken:
Java:
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

public class JPassword extends JPanel
{
	private final JPasswordField fPW_1;
	private final JPasswordField fPW_2;

	public JPassword(final int maxLength) {
		super(new GridLayout(0, 1));

		this.fPW_1 = new JPasswordField(10);
		fPW_1.addKeyListener(new KeyAdapter()
		{
			private int pwLength = 0;

			@Override
			public void keyPressed(KeyEvent e) {
				if(KeyEvent.VK_BACK_SPACE == e.getKeyCode()) {
					System.out.println("remove char");
					if(pwLength > 0) {
						pwLength--;
					}
				} else if(pwLength < maxLength) {
					System.out.println("add char");
					pwLength++;
				} else {
					char[] password = fPW_1.getPassword();
					fPW_1.setText(new String(cutPw(password, maxLength)));
					System.out.println("max chars reached");
					fPW_2.requestFocus();
				}
			}
		});
		add(fPW_1);
		
		this.fPW_2 = new JPasswordField(10);
		fPW_2.addKeyListener(new KeyAdapter()
		{
			private int pwLength = 0;

			@Override
			public void keyPressed(KeyEvent e) {
				if(KeyEvent.VK_BACK_SPACE == e.getKeyCode()) {
					System.out.println("remove char");
					if(pwLength > 0) {
						pwLength--;
					}
				} else if(pwLength < maxLength) {
					System.out.println("add char");
					pwLength++;
				} else {
					char[] password = fPW_2.getPassword();
					fPW_2.setText(new String(cutPw(password, maxLength)));
					System.out.println("max chars reached");
					fPW_1.requestFocus();
				}
			}
		});
		add(fPW_2);
	}

	private char[] cutPw(char[] pw, int maxLength) {
		int pwLength = maxLength;
		if(pw.length < pwLength) {
			pwLength = pw.length;
		}
		char[] pwChar = new char[pwLength];
		for(int i = 0; i < pwChar.length; i++) {
			pwChar[i] = pw[i];
		}
		return pwChar;
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 400);
		frame.setLayout(new GridLayout(0, 1));
		frame.add(new JPassword(10));
		frame.setVisible(true);
	}
}

Gruß

Fabio
 
Zuletzt bearbeitet:
Nun ... ja da versteht ihr was falsch : der übergebene int-Wert gibt nur die Darstellungslänge an *analog HTML : length="xx" sichtbare Anzahl*. Um jetzt sinnvoll die Eingabe zu überprüfen sollte man von PlainDocument ableiten und dieses dann setzen. Damit geht das ganze sehr viel einfacher und ohne KeyListener.
 

Neue Beiträge

Zurück