我正在java上做一个简单的登录应用程序,其中用户输入是一个具有MaskFormatter的JFormattedTextField。我想要做的是 JFormattedTextField 失去焦点想要删除 MaskFormatter (因为我有一个“占位符”)并在再次获得焦点时添加 MaskFormatter (因此 MaskFormatter 仅在用户实际处于JFormattedTextField。我发现添加 MaskFormatter 的唯一方法是通过构造函数。下面是一些代码:
usuario = new JFormattedTextField(new MaskFormatter("########U"));
usuario.addFocusListener(this);
usuario.setBounds(64, 182, 267, 24);
usuario.setBorder(null);
usuario.setText("Introduce tu nombre de usuario");
usuario.setForeground(new Color(204, 204, 204));
usuario.setFont(new Font("Cascadia Code", Font.PLAIN, 11));
contentPane.add(usuario);
@Override
public void focusGained(FocusEvent e) {
if (usuario == e.getSource()) {
// set MaskFormatter here
if (usuario.getText().equals("Introduce tu nombre de usuario")) {
usuario.setText("");
usuario.setForeground(Color.BLACK);
}
}
}
@Override
public void focusLost(FocusEvent e) {
if (usuario == e.getSource()) {
// remove MaskFormatter here
if (usuario.getText().equals("")) {
usuario.setText("Introduce tu nombre de usuario");
usuario.setForeground(new Color(204, 204, 204));
}
}
}
我尝试使用 setFormatterFactory 方法解决问题,但我不知道它是如何工作的,也无法在互联网上找到任何内容
我有一个“占位符”
也许您可以使用文本提示,其设计目的是在未输入文本时在文本字段中显示“提示文本”。
该代码无法像 JFormattedTextField 一样工作,因为格式化文本字段似乎会根据掩码的大小向文档添加空格。
在上面类的
checkForPrompt()
方法中你可以尝试将代码更改为:
String text = "";
try
{
text = document.getText(0, document.getLength()).trim();
}
catch (BadLocationException e) {}
// Text has been entered, remove the prompt
if (text.length() > 0)
//if (document.getLength() > 0)
看看它是否按照您想要的方式工作。