【发布时间】:2012-07-29 23:24:34
【问题描述】:
我在使用 JFormattedTextField 中的掩码时遇到问题
我知道它用空格替换无效字符, 或您通过 setPlaceholderCharacter 定义的任何内容, 但我需要它做的是允许删除或退格, 并且不要插入空格来代替我删除的字符 只要掩码中允许字符串的其余部分。
例如,使用掩码:*#*****,则字符串 "12 abc" 有效。
如果将光标放在 b 和 c 字符之间,然后按退格键,我需要它来删除 b,从而产生"12 ac"。相反,它会删除它并添加一个空格,变成:"12 a c"。
下面是一个简单的代码示例来演示。
如果有解决此问题的任何想法或示例,我将不胜感激。
public class testFrame extends javax.swing.JFrame {
public testFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.FlowLayout());
setMinimumSize(new Dimension(300,150));
java.awt.Button closeButton = new java.awt.Button();
JFormattedTextField maskTextField = new JFormattedTextField();
maskTextField.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField);
closeButton.setLabel("close");
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
});
getContentPane().add(closeButton);
try {
MaskFormatter someMask = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory
= new DefaultFormatterFactory(someMask);
maskTextField.setFormatterFactory(formatterFactory);
} catch (ParseException ex) {
ex.printStackTrace();
}
maskTextField.setText("12 abc");
pack();
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testFrame().setVisible(true);
}
});
}
}
更新代码以反映下面的答案。我添加了第二个字段,以便您可以查看有无修复的行为。也是一个小修复,我调整了窗口的大小并将其在屏幕中居中以使其更友好。
公共类 testFrame 扩展 javax.swing.JFrame {
public testFrame() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(300, 200));
getContentPane().setLayout(new java.awt.FlowLayout());
JFormattedTextField maskTextField = new JFormattedTextField();
maskTextField.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField);
JFormattedTextField maskTextField2 = new JFormattedTextField();
maskTextField2.setMinimumSize(new Dimension(100,30));
getContentPane().add(maskTextField2);
java.awt.Button closeButton = new java.awt.Button();
closeButton.setLabel("close");
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
});
getContentPane().add(closeButton);
try {
MaskFormatter someMask = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory =
new DefaultFormatterFactory(someMask);
maskTextField.setFormatterFactory(formatterFactory);
MaskFormatter someMask2 = new MaskFormatter("*#****");
DefaultFormatterFactory formatterFactory2 =
new DefaultFormatterFactory(someMask2);
maskTextField2.setFormatterFactory(formatterFactory2);
} catch (ParseException ex) {
ex.printStackTrace();
}
maskTextField.setText("12 abc");
maskTextField2.setText("12 abc");
// added per suggestion below
if (maskTextField.getFormatter() instanceof DefaultFormatter) {
DefaultFormatter f = (DefaultFormatter) maskTextField.getFormatter();
f.setAllowsInvalid(true);
// options are:
// JFormattedTextField.COMMIT
// JFormattedTextField.COMMIT_OR_REVERT --> default
// JFormattedTextField.REVERT
// JFormattedTextField.PERSIST
maskTextField.setFocusLostBehavior(JFormattedTextField.PERSIST);
}
pack();
this.setLocationRelativeTo(null);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new testFrame().setVisible(true);
}
});
}
}
【问题讨论】:
-
听起来有点误解:掩码是具有固定长度的东西,每个位置由有效字符或占位符填充。在删除字符时,它被 placeHolder 替换,在您的示例中,这是默认的空格。因此,第一个空间与第二个空间在语义上是不同的 :-) 将 placeHolder 更改为其他内容,以查看差异。由于您的要求似乎类似于任何字符到一个最大值后的 4 个字符,因此您必须按照@DuncanJones 的建议实现自定义格式化程序
-
我不介意它是固定长度的,我想我只是有一个他们没有满足的特殊用例。例如,如果您的掩码是 (###) ###-### 并且您尝试输入 (123) 456-7890 并意外输入了两个 2,即 (122) 345-6789,则标准掩码行为似乎意味着如果您删除前 2 个,它将替换一个空格(占位符)给您(12)345-6789。我需要它来删除字符并在字符串末尾添加占位符。但我想这不是其他人需要的,所以我必须制作一个自定义格式化程序:(
-
啊...我明白了,感谢您的澄清
标签: java swing jformattedtextfield