从JFormattedTextField获取原始的,未格式化的,未屏蔽的文本

时间:2014-01-12 20:37:41

标签: java swing jformattedtextfield

我有一个JFormattedTextField,用以下格式屏蔽电话号码:

 (###) ###-####

我需要检索未格式化的原始##########以存储在数据库中。

目前,我正在使用.getText().replaceAll("\\)", "").replaceAll("\\(", "").replaceAll("-", "").replaceAll(" ", ""),但这似乎应该更容易。

有没有办法从JFormattedTextField获取未屏蔽的,未格式化的原始输入?

以下是MVCE来说明:

public static void main(String args[]) {
    final JFormattedTextField phone = new JFormattedTextField();
    try {
        phone.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("(###) ###-####")));
    } catch(ParseException e) {
        e.printStackTrace();
    }
    phone.setPreferredSize(new Dimension(125, phone.getPreferredSize().height));
    final JButton button = new JButton("Get Text");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(phone.getText().replaceAll("\\)", "").replaceAll("\\(", "").replaceAll("-", "").replaceAll(" ", ""));
        }
    });
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    panel.add(phone);
    panel.add(button);
    frame.add(panel);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

3 个答案:

答案 0 :(得分:2)

为什么不使用MaskFormatter

    maskF = new MaskFormatter("(###) ###-####");
    maskF.setValueContainsLiteralCharacters ( false );  
    askF.setOverwriteMode ( true );  
    maskF.setValidCharacters ( "0123456789" );  

    fTextField  = new JFormattedTextField(maskF);           
    fTextField.addPropertyChangeListener("value", this);

     //...

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        Object source = e.getSource();
        if (source == fTextField) {

            if(fTextField.getValue() != null){
                System.out.println((fTextField.getValue()));
            } 
        }    
    }

键入(123) 456-7890,然后按Enter键。输出将是

1234567890

通常,由于掩码未完成,fTextField.getValue()会返回null

完整代码

public class Main implements PropertyChangeListener {

    private JFormattedTextField fTextField;
    private MaskFormatter maskF ;

      public static void main(String args[]) throws ParseException {              
          new Main().init(); 
      }

    private void init() throws ParseException {
           JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container content = f.getContentPane();
            content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));


            maskF = new MaskFormatter("(###) ###-####");
            maskF.setValueContainsLiteralCharacters ( false );  
            maskF.setOverwriteMode ( true );  
            maskF.setValidCharacters ( "0123456789" );  

            fTextField  = new JFormattedTextField(maskF);           
            fTextField.addPropertyChangeListener("value", this);
            content.add(fTextField );
            f.setSize(300, 100);
            f.setVisible(true);        
    }


    @Override
    public void propertyChange(PropertyChangeEvent e) {
        Object source = e.getSource();
        if (source == fTextField) {

            if(fTextField.getValue() != null){
                System.out.println((fTextField.getValue()));
            } 
        }    
    }
    }

答案 1 :(得分:1)

您可以使用字符类来清理代码"[\\s()-]"

System.out.println(phone.getText().replaceAll("[\\s()-]", ""));

答案 2 :(得分:-2)

创建辅助变量以放置原始值,并将辅助变量中的值存储到数据库中。 JFormattedTextField只是为了显示格式的更改值。