添加密码字段 - GUI

3

我有一个JTextField。该JTextField将用于获取用户的用户名和密码。因此,如果正在获取用户名,我会在文本字段上显示用户输入的内容。但是如果输入密码,则应该隐藏密码(而是显示*字符)。

如何使JTextField隐藏用户输入的字符?

伪代码:

If (usernameBool!=true) {
 // Display normal text - user is able to see the password
} else {
// This is going to be a password field, so i need to not show the password to the user instead show it as ******* instead.

}

注意:我不想在此处使用JPasswordField

2
我不想为此使用JPasswordField。为什么呢? - Cubic
1
因为我正在使用相同的JTextField来获取用户名和密码。而且我不想添加任何其他字段。 - Sharon Watinsan
2
“我不想要。” 那么你宁愿写一些笨拙的东西,而且没有任何理由浪费时间吗?这不是一个好的观点。 - Jack
1
弹出一个 JOptionPane,其中包含如此所见的两个组件这里 - Andrew Thompson
2
我就是不明白为什么这篇帖子会被踩。这是一个合理的问题,似乎没有人知道答案。难道这就是它被踩的原因吗? - Sharon Watinsan
显示剩余5条评论
4个回答

6

再次提醒,一种可能的解决方案是使用CardLayout来交换组件:

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class SwapFields {
   private static final String TEXT_FIELD = "text field";
   private static final String PASS_FIELD = "pass field";

   public SwapFields() {
      // TODO Auto-generated constructor stub
   }

   private static void createAndShowGui() {
      final JTextField textField = new JTextField(10);
      final JPasswordField passwordField = new JPasswordField(10);

      final CardLayout cardLayout = new CardLayout();
      final JPanel cardPanel = new JPanel(cardLayout);
      cardPanel.add(textField, TEXT_FIELD);
      cardPanel.add(passwordField, PASS_FIELD);

      JToggleButton toggleBtn = new JToggleButton("Entering Password");
      toggleBtn.addItemListener(new ItemListener() {

         @Override
         public void itemStateChanged(ItemEvent iEvt) {
            if (iEvt.getStateChange() == ItemEvent.SELECTED) {
               cardLayout.show(cardPanel, PASS_FIELD);
               passwordField.requestFocusInWindow();
            } else {
               cardLayout.show(cardPanel, TEXT_FIELD);
               textField.requestFocusInWindow();
            }
         }
      });

      JButton showNamePasswordBtn = new JButton("Show Results");
      showNamePasswordBtn.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            System.out.println("Name: " + textField.getText());

            // never do this!
            System.out.println("Pass: " + new String(passwordField.getPassword()));
         }
      });

      JPanel mainPanel = new JPanel();
      mainPanel.add(cardPanel);
      mainPanel.add(toggleBtn);
      mainPanel.add(showNamePasswordBtn);

      JFrame frame = new JFrame("SwapFields");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

好的,我会隐藏JTextField并显示JPasswordField。谢谢。 - Sharon Watinsan

5

JPasswordField有一个方法叫做setEchoChar()。根据文档说明:

设置此JPasswordField的回显字符。...设置值为0表示您希望看到输入的文本,类似于标准JTextField的行为。

因此,您可以仅使用JPasswordField并仅对密码启用回显字符(例如'*')。


2

我建议您使用JPasswordField。当usernameBool为真时,设置它显示字符,否则隐藏字符,如下所示:

if (usernameBool) {
     password.setEchoChar((char) 0);
} else {
     password.setEchoChar('*');
}

-1
你可以创建自己的JTextField并采用自己的策略。例如,你可以保留最后一个字符(如iOS系统),或者不显示任何内容(Linux风格)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接