2017-02-15 1 views
0

그래서 내 텍스트 필드에 입력되는 내용이 숫자이며 영숫자가 아닌지 확인하려고합니다. 형식화 된 텍스트 상자를 살펴 보았지만이를 구현할 수 없었습니다. 자습서 오라클에 대한 이해가 부족하기 때문에 사이트에 있습니다. 좀 더 검색을하고 핵심 수신기 클래스를 찾았으며 최상의 옵션처럼 보였습니다.키 수신기를 사용하여 텍스트 필드에 입력을 확인하는 방법

그래서 프로그램을 실행하고 문자 이벤트를 사용하는 대신 텍스트 필드에 입력하면 경고음이 울립니다. 여기에 코드입니다 : 여기

private void buildPanel() 
{ 
    // Create a label to display instructions. 
    messageLabel = new JLabel("Enter a time in seconds the object has fallen"); 

    // Create a text field 10 characters wide 
    fallingTextField = new JTextField(10); 

    // Add a keylistener to the text field 
    fallingTextField.addKeyListener(new TextFieldListener()); 

    // Create a button with the caption "Calculate" 
    calcButton = new JButton("Calcualte"); 

    // Add an action listener to the button 
    calcButton.addActionListener(new CalcButtonListener()); 

    //Create a JPanel object and let the panel field reference it 
    panel = new JPanel(); 

    // Add the label, text field, and button components to the panel 
    panel.add(messageLabel); 
    panel.add(fallingTextField); 
    panel.add(calcButton); 
} 

/** 
    The TextFieldListener class checks to see if a valid key input is typed into 
    the text field. 
*/ 
private class TextFieldListener implements KeyListener 
{ 
    /** 
     The keyPressed method 
     @param evt is a key event that verifies a number is inputed otherwise 
     the event is consumed. 
    */ 
    public void keyPressed(KeyEvent evt) 
    { 
     char c = evt.getKeyChar(); 
     if(Character.isAlphabetic(c)) 
     { 
      getToolkit().beep(); 
      evt.consume(); 
     } 
    } 
    public void keyReleased(KeyEvent e) 
    { 

    } 
    public void keyTyped(KeyEvent ev) 
    { 

    } 
} 
+1

돈 당신처럼, 마지막 문자 않고 필드의 값을 설정해야 'KeyListener'를 사용하지 말고'KeyListener'를 사용하지 말고 대신'DocumentFilter'를 사용하십시오. – MadProgrammer

+0

을위한 것입니다. 포맷터가 작동하지 않으면 ... 그걸 포기하지 마라. 그 것을 사용하는 법을 계속 읽고 배우십시오. 아시다시피, 문제가 발생하여 포기하기로 결정했습니다. 그러지 마. ** 퍼즐을 풀어 ** 프로그래밍을 배웁니다. 다른 하나를 교환하지 않음 ... – GhostCat

+0

사용자가 텍스트를 필드에 붙여 넣으면 어떻게됩니까? (힌트 없음) – MadProgrammer

답변

2

:

if(Character.isAlphabetic(c)) 
    { 
     getToolkit().beep(); 

당신은 알파벳 문자를 입력 할 때마다 삐 소리 리스너를 말한다. 그렇게하면 경고음이 울립니다.

코드와 정확히 일치하는 모든 작업을 수행해야합니다.

질문의 다른 부분은; consume()에 대한 Javadoc (InputEvent에서 상속)을 확인하십시오.

이 이벤트를 소비하므로 원래 발생한 원본에서 처리되지 않습니다.

너는 소스 가지가 아닙니다. 이벤트가 이미 생성되고 리스너로 전달됩니다. 귀하의 컨텍스트에서 consume()을 호출하면 ... 더 이상 아무것도하지 않습니다. 그것은 다소 "아니오 op"입니다.

다시 입력 : 키보드 입력을 기다리는 코드를 작성했으며 입력이 영문자이면 신호음이 울리는 입니다. 즉 코드가 수행하는 모두입니다. 예를 들어 "/"를 입력하면 ... 아무 일도 일어나지 않을 것이라고 생각합니다. 의 유효성을으로 확인하려면 "피드백"루프가 필요합니다. 예를 들어 잘못된 입력을 감지하면 리스너가 텍스트 필드 내용을 덮어 쓸 수 있습니다.

+0

그럼에도 불구하고 evt.consume(); getToolKit(). beep() 아래에서 경고음 만 울릴까요? 키 입력이 올바르지 않다는 것을 사용자에게 알려주고 이벤트를 소비하는 것은 경고음이 들릴 것이라고 생각했습니다. –

+0

내 업데이트를 참조하십시오. – GhostCat

1

문제는 이미 이벤트가 처리 될 때까지 문자가 추가되었다고 생각합니다. 당신이 Oracle 사이트에서 예제를 사용하여 다음과 같은 마스크 입력을 사용할 수 있습니다, 또는

fallingTextField.setValue(fallingTextField.getValue().substring(0, fallingTextField.getValue().length - 1)) 

:

zipField = new JFormattedTextField(
        createFormatter("#####")); 
... 
protected 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; 
} 
+0

감사합니다. 마스킹 튜토리얼을 다시 읽으겠습니다. 오라클이 가지고있는 것과 제가 보여 준 것을 구현하는 방법에 대해 더 잘 이해할 수 있는지 확인하겠습니다. 튜토리얼 링크는 –

+0

(1+)입니다. 이 문제는 도움이 될뿐만 아니라 튜토리얼을 모든 Swing 기본 사항에 대한 참조로 사용할 수 있습니다. – camickr

관련 문제