0

これが私が必要とするものです: ユーザーが次のいずれかを入力できるテキストフィールド:

1234567890 または 11234567890

それに応じてフォーマットする必要があります

123-456-7890 または 1 123-456-7890

基本的に、国コードの有無にかかわらず電話番号です。これまでのところ、次のことを行うコードがあります。

if (isPhone && !getText().equals(BLANK_STRING)) {
        int phoneLength = getText().replaceAll("[^0-9]", "").length();
        String text = getText().replaceAll("[^0-9]", "");
//We call the method to format the entered text after we left the field
        setPhoneFormatMask(phoneLength, text); 
}

private void setPhoneFormatMask(int length, String text) {
    System.out.println("length = " + length);
    System.out.println("text = " + text);
    switch (length) {
        case 10:
            try {
                System.out.println("Setting mask");
                numberMaskFormat.setMask("###-###-####");
            } catch (ParseException ex) {
                Logger.getLogger(WWNumericFormattedTextField.class.getName()).log(Level.SEVERE, null, ex);
            }
            break;
        case 11:
            try {
                System.out.println("setting mask 2");
                numberMaskFormat.setMask("# ###-###-####");
            } catch (ParseException ex) {
                Logger.getLogger(WWNumericFormattedTextField.class.getName()).log(Level.SEVERE, null, ex);
            }
            break;
    }
    setFormatter(numberMaskFormat);
    System.out.println("n:" + numberMaskFormat.getMask());
    setText(text);
}

@Override
public void focusGained(FocusEvent e) {
    if (isPhone) {
        try {
            numberMaskFormat.setMask("**************");
        } catch (ParseException ex) {
            Logger.getLogger(WWFormattedTextField.class.getName()).log(Level.SEVERE, null, ex);
        }
        setFormatter(numberMaskFormat);
    }
}

コンソール出力:

//Application launched
focus gained
n2:**************
//I entered 9051234567 and tabbed out
Focus lost
length = 10
text = 9051234657
Setting mask
n:###-###-####
Formatted text =    -   -    
//Tabbed back in
focus gained
n2:**************
//Entered 19051234567 and tabbed out
Focus lost
length = 11
text = 19051234567
setting mask 2
n:# ###-###-####
Formatted text = 

フォーカスが失われた後に JFormattedTextField 内のテキストをフォーマットする方法についてアドバイス/ヘルプ/ガイダンスが必要で、フォーマットは入力された桁数によって異なります。

4

1 に答える 1

0

まず、マスクを使用します。#任意の有効な数値に対して、Character.isDigit を使用します*。これは、任意の文字に対して機能するためです。

次にDefaultFormatterFactory、フォーマッターを次のように設定するときに使用しますJFormattedTextFeild

    ftf.setFormatterFactory(new DefaultFormatterFactory(
                                                new MaskFormatter("######"))); 

ftfですJFormattedTextFeild。to do チェックにを割り当てて、フォーカス喪失イベントでテキストを検証してみてくださいinput verifierformatted text fieldは、フォーカスを失うイベントInputVarifierで関数を呼び出して、boolean shouldYieldFocus(JComponent input)フォーカスを失う必要があるかどうかを確認します。私はあなたのためにサンプルの例を書きました。あなたのニーズに合わせて簡単に採用することができます:

 class myInputVarifier extends InputVerifier
{
  public boolean maskChanged = false;
  MaskFormatter maskFormatter ;
  JFormattedTextField ftf;
  @Override
  public boolean verify(JComponent input) {
    if (input instanceof JFormattedTextField) {
             ftf = (JFormattedTextField)input;
             maskFormatter = (MaskFormatter) ftf.getFormatter();
             ;
             if(!isValid()) return false; 
                           // check with mask ###### first, if valid change the mask
                           // to # ##-### and reset the text 

             if(!maskChanged)
             {
               try {
                    String text = ftf.getText();  
                           // get the text formatted as ###### = 112123
                     maskFormatter.setMask("# ##-###");
                     ftf.setFormatterFactory(
                                           new DefaultFormatterFactory(maskFormatter));
                     ftf.setText(text);
                          //resetting the text will be formatted as # ##-### = 1 12-123
                     maskChanged = true;
               } catch (ParseException ex) {
                   }

               return isValid();
             }


          }
          return true;
  }

  public boolean isValid()
  {
        try {
           maskFormatter.stringToValue(ftf.getText());
           return true;
         } catch (ParseException pe) {
             return false;
           }
   }

  @Override
  public boolean shouldYieldFocus(JComponent input) {
    return verify(input);
  }
}   
于 2013-10-11T21:04:18.127 に答える