JFormattedTextField特定格式

时间:2013-12-14 08:25:06

标签: java swing format document jformattedtextfield

我需要按照格式“00:00”制作一个JFormattedTextField,但有一些要求:

  • 唯一可变的应该是“00”。 (所以“:”不应该是可删除的)
  • Tab可让您在“:”的两边进行更改。 (所以将光标放在一边,标签标记另一边的“00”)
  • 将“00”更改为“2”应将其格式化为“02”。
  • 字符限制应为5,包括“:”。 (4个可变字符)
  • 应该初始化为“00:00”,但不应该是可接受的输入。
  • 您不应该输入除数字以外的任何内容。 (字母,符号,负数等)。

有办法做到这一点吗?我已经查看了不同的格式化程序,验证程序和文档过滤器以添加到JFormattedTextField,但我不确定要使用哪些。 (现在使用DefaultFormatter,但是已经查看了NumberFormatter的限制。我是否需要使用格式化程序和验证器的组合?)

这是我现在的JFormattedTextField:http://pastebin.com/jW2RSJXe [1]。

从代码执行到示例/指针的任何内容都将受到赞赏!

1 个答案:

答案 0 :(得分:2)

运行此示例。它使用MaskFormatter:永久存在,但我不知道如何格式化问题的其他部分,如果你只有2,它会显示02.你可以玩它

import java.awt.BorderLayout;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;

public class MaskFormatterTest extends JPanel {

    private JFormattedTextField formatText;

    public MaskFormatterTest() {
        formatText = new JFormattedTextField(createFormatter("##:##"));
        formatText.setColumns(20);
        formatText.setText("00:00");

        setLayout(new BorderLayout());
        add(new JLabel("Enter only numbers"), BorderLayout.NORTH);
        add(formatText, BorderLayout.CENTER);
    }

    private MaskFormatter createFormatter(String s) {
        MaskFormatter formatter = null;
        try {
            formatter = new MaskFormatter(s);
        } catch (java.text.ParseException exc) {
            System.err.println("formatter is bad: " + exc.getMessage());
            System.exit(-1);
        }
        return formatter;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("MaskFormatter example");
                frame.add(new MaskFormatterTest());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationByPlatform(true);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}

MaskFormatter设置每个位置的每个字符的类型值和允许的大小。在这种情况下,我使用##:##。允许两位数,冒号和两位数。

更新:在代码中添加formatText.setText("00:00");以初始化文本字段。