我有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
用于此
答案 0 :(得分: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();
}
});
}
}
答案 1 :(得分:5)
JPasswordField
的方法为setEchoChar()
。正如文件所述:
设置此JPasswordField的回显字符。 ...设置值为0表示您希望在键入文本时看到该文本,类似于标准JTextField的行为。
然后,您只需使用JPasswordField
并仅为密码启用回音字符(例如'*'
)。
答案 2 :(得分:2)
我建议您使用JPasswordField
。然后,当您的usernameBool
为真时,将其设置为显示字符,否则隐藏字符,如下所示:
if (usernameBool) {
password.setEchoChar((char) 0);
} else {
password.setEchoChar('*');
}
答案 3 :(得分:-1)
您可以创建自己的JTextField,这是您自己的策略。例如,您可以保留最后一个字符(如果我记得的话就像iOS一样)或者不显示任何内容(Linux风格)。