3

我希望用户输入时间,比如 12:00,但我需要弄清楚一些事情,我很迷茫。

  1. 我可以将文本限制为 5 个字符吗?如何?
  2. 我可以在代码中嵌入一个冒号,以便用户无法删除它吗?
  3. 最后,我可以拿那个代码并验证它只是数字吗(当然忽略冒号)
4

3 回答 3

7

答案是使用JFormattedTextFieldMaskFormatter

例如:

String mask = "##:##";
MaskFormatter timeFormatter = new MaskFormatter(mask);
JFormattedTextField formattedField = new JFormattedTextField(timeFormatter);

Java 编译器将要求您在创建 MaskFormatter 时捕获或抛出 ParseException,因此请务必执行此操作。

于 2012-06-26T21:35:59.287 回答
2

或者只是放弃您的文本字段并选择由包含冒号(或两个实例)JSpinner分隔的两个实例。JLabelJTextField

不完全确定这个解决方案对用户来说是否更直观,但我认为是的。

于 2012-06-27T05:33:41.610 回答
0

一个老问题的迟到的答案;利用DocumentFilter可以实现这三个要求。

非生产质量代码可能是这样的

String TIME_PATTERN = "^\\d\\d:\\d\\d\\s[AP]M$";

final JTextField tf = new JTextField("00:00 AM", 8);

((AbstractDocument)tf.getDocument()).setDocumentFilter(new DocumentFilter() {
    public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {

        String text = fb.getDocument().getText(0, fb.getDocument().getLength());

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(text.matches(TIME_PATTERN)) {
            super.replace(fb, offs, length, str, a);
            return;
        }

        text = fb.getDocument().getText(0, fb.getDocument().getLength());

        if(offs == 2 || offs == 5)
            tf.setCaretPosition(++offs);

        if(length == 0 && (offs == 0 ||offs == 1 ||offs == 3 ||offs == 4 ||offs == 6))
            length = 1;

        text = text.substring(0, offs) + str + text.substring(offs + length);

        if(!text.matches(TIME_PATTERN))
            return;

        super.replace(fb, offs, length, str, a);

    }

    public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException { }

    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException { }

});
于 2016-02-13T22:20:41.183 回答