2017-02-13 4 views
0

Je développe une application de bureau. Dans cette application, je dois utiliser le clavier virtuel/numberpad pour les opérations de connexion, etc.Création d'un pavé numérique virtuel en Java

J'ai créé un JFrame comme ceci: enter image description here

et le code de création de boutons est

numberButtons = new JButton[10]; 
    for(int i = 0; i < numberButtons.length; i++) { 
     numberButtons[i] = new JButton(String.valueOf(i)); 
    numberButtons[i].setFont(new java.awt.Font("Open Sans", 0, 14)); 
    numberButtons[i].setPreferredSize(new java.awt.Dimension(100, 50)); 

    numberButtons[i].addActionListener(new ActionListener() 
    { 
     public void actionPerformed(java.awt.event.ActionEvent evt) 
     { 
      numberButtonActionPerformed(evt); 
     } 
    }); 
     numberPanel.add(numberButtons[i]); 
    } 

et de l'action la méthode est:

private void numberButtonActionPerformed(ActionEvent evt) { 

    String currentPassword = ((JButton) evt.getSource()).getText(); 

    passwordField.requestFocus(); 
    passwordField.setText(passwordField.getText() + currentPassword); 
    if (Arrays.equals(pass, passwordField.getPassword())) { 
     System.out.println("Correct"); 
    } 
} 

mais la méthode gettext de jpasswordfield est envoyée. Il n'est pas recommandé d'utiliser. J'ai une autre idée pour écrire la méthode actionperformed pour chaque bouton et utiliser "KeyEvent.VK_" dans l'action de chaque boutons. Cependant, je ne pense pas que ce soit une bonne façon de le faire. Que recommanderais-tu?

+0

Chaque bouton doit ajouter un caractère à un tableau ou une liste, ce que vous essayez de faire, n'est pas générer un 'String' du mot de passe. Vous devrez peut-être insérer du contenu directement dans 'Document' de' JPasswordField' – MadProgrammer

+0

Puisque je veux ajouter un caractère à passwordfield quand le bouton est cliqué, j'ai dû utiliser la méthode 'passwordfield.settext' dont j'avais besoin pour utiliser la chaîne. Quelle est l'autre manière d'insérer directement dans le document de JPasswordField que vous avez mentionné? – Emre

+0

Non, vous devez utiliser le document # insertString, en insérant chaque caractère (en tant que chaîne individuelle) dans le document – MadProgrammer

Répondre

0

Vous avez déjà utilisé passwordField.getPassword(). C'est la bonne façon de le faire. Les documents disent que getText a été remplacé par getPassword: https://docs.oracle.com/javase/7/docs/api/javax/swing/JPasswordField.html#getText()

Pour construire une chaîne à partir du retour char[] utilisation constructeur this.

+0

* "Pour construire une chaîne à partir du caractère retourné []" * - cela annule le but de ne pas utiliser getText en premier lieu – MadProgrammer

+0

@Selim Vous voulez dire que je devrais faire quelque chose comme ça: 'private void numberButtonActionPerformed (ActionEvent evt) { passwordField.requestFocus(); passwordField.setText (nouvelle chaîne (passwordField.getPassword()) + ((JButton) evt.getSource()). GetText()); if (Arrays.equals (passe, passwordField.getPassword())) { System.out.println ("Correct"); } } ' – Emre

+0

@Emre oui. Cependant, cela irait à l'encontre du but de la "sécurité" que le 'char []' est censé vous donner comme @MadProgrammer l'a indiqué.Dans ce cas, vous pouvez également remplacer 'Arrays.equals' par' pass.equals (new String (passwordField.getPassword())) ' – Selim

0

Créez une classe de boutons qui encapsule un JButton, la création d'un écouteur et toute autre fonctionnalité utile. Utilisez ensuite cette classe en remplacement du code de création des boutons.

0

mais la méthode gettext de JPasswordField est envoyé

Ne pas utiliser setText (...) pour rétablir l'intégralité du texte.

Ajoutez simplement le caractère tapé à la fin du composant de texte. Une façon de faire est d'utiliser la méthode replaceSelection(...) du composant de texte.

Extraire: Attaching A Single Action Listener To All Buttons pour un exemple de travail. Notez que l'exemple vous permettra de taper le caractère ou de cliquer sur le bouton.