我有一个'格式化'字段 - 即它最终必须是这样的形式:xx / xxxx / xx 我想这样做,以便在打字时你自动添加'/'。
我想要拼凑的方式是这样的:
JTextField field = new JTextField ("xx/xxxx/xx");
// a focus listener to clear the "xx/xxxx/xx" on focus & restore on focus-out
// the override the 'document' with this:
field.setDocument (new PlainDocument () {
public void insertString (int off, String str, AttributeSet attr) throws BadLocationException {
if (off == 2 || off == 7) {
super.insertString (off + 1, str + "/", attr);
}
}
}
这似乎会破坏 - 我如何正确处理它:xx / xx ..到xx?我认为让他们删除'/'是好的。
我觉得应该有更好的方法吗?也许我可以使用的图书馆?除了我......特别的东西。
感谢你的任何输入!!
答案 0 :(得分:3)
嗯,您可以使用JFormattedTextField
查看下面的示例,这将创建一个JFormattedTextField
whic只接受数字并将其放入XX / XXXX / XX形式:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.text.MaskFormatter;
public class FormattedTextFieldExample extends JFrame {
public FormattedTextFieldExample() {
initComponents();
}
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(200, 200));
getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
MaskFormatter mask = null;
try {
//
// Create a MaskFormatter for accepting phone number, the # symbol accept
// only a number. We can also set the empty value with a place holder
// character.
//
mask = new MaskFormatter("##/####/##");
mask.setPlaceholderCharacter('_');
} catch (ParseException e) {
e.printStackTrace();
}
//
// Create a formatted text field that accept a valid phone number.
//
JFormattedTextField phoneField = new JFormattedTextField(mask);
phoneField.setPreferredSize(new Dimension(100, 20));
getContentPane().add(phoneField);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FormattedTextFieldExample().setVisible(true);
}
});
}
}
参考:
答案 1 :(得分:0)
为此,我做到了这一点:
JTextField field = new JTextField ();
field.setDocument (new PlainDocument () {
public void insertString (int off, String str, AttributeSet attr) throws BadLocationException {
if (off < 10) { // max size clause
if (off == 1 || off == 6) { // insert the '/' occasionally
str = str + "/";
}
super.insertString (off, str, attr);
}
}
});
field.setText ("xx/xxxx/xx"); // set AFTER otherwise default won't show up!
field.setForeground (ColorConstants.DARK_GRAY_080); // make it light!
field.addFocusListener (new ClearingFocusListener (field)); // could be done in an anonymous inner class - but I use it other places
private static class ClearingFocusListener implements FocusListener {
final private String initialText;
final private JTextField field;
public ClearingFocusListener (final JTextField field) {
this.initialText = field.getText ();
this.field = field;
}
@Override
public void focusGained (FocusEvent e) {
if (initialText.equals (field.getText ())) {
field.setText ("");
field.setForeground (ColorConstants.DARK_GRAY_080);
}
}
@Override
public void focusLost (FocusEvent e) {
if ("".equals (field.getText ())) {
field.setText (initialText);
field.setForeground (ColorConstants.LIGHT_GRAY_220);
}
}
}
这与另一个解决方案的不同之处在于,当没有文本时,'/'不存在,它被添加到正确的位置。它目前没有处理任何替换的东西 - 呃。 :/