【问题标题】:Adding a password field - GUI添加密码字段 - GUI
【发布时间】:2012-12-03 07:57:11
【问题描述】:

我有一个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

【问题讨论】:

  • “我不想为此使用 JPasswordField”,为什么?
  • 因为我使用相同的 JTextField 来获取用户名和密码。我不想添加任何其他字段
  • “我不想要”。所以你更喜欢无缘无故地写一些尴尬的东西并为此花时间?这不是一个好点。
  • 弹出一个JOptionPane,其中两个组件如here所示。
  • 我只是不明白为什么这篇文章被否决了。这是一个有效的问题,似乎没有人知道答案。这就是它被否决的原因吗?

标签: java swing jtextfield jpasswordfield


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    JPasswordField 有一个方法是setEchoChar()。正如文档所述:

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

    然后您可以只使用JPasswordField 并为密码启用回显字符(例如'*')。

    【讨论】:

      【解决方案3】:

      同样,一种可能的解决方案是使用 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。谢谢
      【解决方案4】:

      您可以根据自己的策略创建自己的 JTextField。例如,您可以保留最后一个字符(如果我记得的话,就像 iOS)或不显示任何内容(Linux 风格)。

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 2018-11-24
        • 1970-01-01
        • 2016-04-09
        • 2015-05-10
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2020-09-15
        相关资源
        最近更新 更多