gpt4 book ai didi

java - 在 JFormattedTextField 中删除掩码时遇到问题

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:03 25 4
gpt4 key购买 nike

我在使用 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);
}
});
}
}

更新代码以反射(reflect)下面的答案。我添加了第二个字段,以便您可以查看修复和未修复时的行为。还有一个小的修复,我调整了窗口的大小并将其置于屏幕的中央以使其更友好。

公共(public)类 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);
}
});
}

最佳答案

首先,感谢您发布了一个不错的工作示例。

DefaultFormatter 似乎是您的屏蔽文本字段使用的格式化程序。我发现我可以通过以下方式允许临时无效的编辑:

if (maskTextField.getFormatter() instanceof DefaultFormatter) {
DefaultFormatter f = (DefaultFormatter) maskTextField.getFormatter();
f.setAllowsInvalid(true);
}

希望这足以让您入门。请注意,如果您在字段中有无效值时更改焦点,此快速修复具有完全删除文本字段内容的有趣行为。这似乎与 JFormattedTextField 的 JavaDoc 相反,它表明默认行为是 COMMIT_OR_REVERT

关于java - 在 JFormattedTextField 中删除掩码时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11752915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com