2013-10-09 3 views
2

나는 수레를 허용하도록 설정된 텍스트 필드를 만들고이 정규식을 사용하려고합니다. 예를 들어 12345.67의 숫자를 입력하면 지울 때 문제가 발생합니다. 왜 입력 번호를 지울 수 없습니다. 왜?>정규식을 사용하는 MaskFormatter

import javax.swing.*; 
import javax.swing.text.*; 

public class DecimalFormatter extends DefaultFormatter { 

    protected java.util.regex.Matcher matcher; 

    public DecimalFormatter(java.util.regex.Pattern regex) { 
    setOverwriteMode(false); 
    matcher = regex.matcher(""); 
    } 

    public Object stringToValue(String string) throws java.text.ParseException { 
    if (string == null) return null; 
    matcher.reset(string); 

    if (! matcher.matches()) 
     throw new java.text.ParseException("does not match regex", 0); 

    return super.stringToValue(string); 
    } 


    public static void main(String argv[]) { 

    JLabel lab1 = new JLabel("Decimal:"); 
    java.util.regex.Pattern Decimal = java.util.regex.Pattern.compile("^[1-9]\\d{0,4}([.]\\d{0,2})?$", java.util.regex.Pattern.CASE_INSENSITIVE); 
    DecimalFormatter decimalFormatter = new DecimalFormatter(Decimal); 
    decimalFormatter.setAllowsInvalid(false); 
    JFormattedTextField ftf1 = new JFormattedTextField(decimalFormatter); 

    JFrame f = new JFrame("DecimalFormatter Demo"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel pan1 = new JPanel(new java.awt.BorderLayout()); 
    pan1.add(lab1, java.awt.BorderLayout.WEST); 
    pan1.add(ftf1, java.awt.BorderLayout.CENTER); 
    lab1.setLabelFor(ftf1); 
    f.getContentPane().add(pan1, java.awt.BorderLayout.SOUTH); 
    f.setSize(300, 80); 
    f.setVisible(true); 
    } 
} 

답변

0

정규 표현식이 그것을 허용하지 않기 때문에. 정규 표현식은 1-9 자의 숫자로 시작하는 문자열과 일치하며 최대 네 자릿수까지, 그리고 선택적으로 마침표와 최대 두 자릿수까지 선택할 수 있습니다. (말하자면, 0.5 당신을 위해 정당하지 않은 이유가 궁금하지만 별도의 질문입니다.)

빈 문자열이 정규식과 일치하지 않습니다 (당신이 무엇을 당신의 예에서 1을 삭제 한 후) 따라서 JFormattedTextField은 허용하지 않습니다.

초기에 JFormattedTextField을 구성하면 처음의 빈 값과 일치시키지 않으므로 허용됩니다. 그러나 사용자가 입력을 시작하면 모든 문자가 삭제 될 때 빈 문자열을 (해당되는 경우) 포함하여 이후에 입력 한 모든 값에 대해 일치 항목을 실행합니다.

당신은 if (string == null || string.trim().equals("")) return null;if (string == null) return null;을 변경 시도해 볼 수도 있습니다 ...이 빈 필드를 허용합니다.

+0

그래서 그 이유는 .. 문자열 null로 반환 ... 오, 그래, 난 그냥 그것에 대해 지금은 그냥 정규식을 0.5를 받아 들일 수 변경할 것입니다 생각 .. 그 오류를 가리키는 주셔서 대단히 감사합니다 – Criz

관련 문제