2011-01-27 1 views
3

JTextField로 autoskip을 구현하고 싶지만 이것을 수행하는 가장 좋은 방법이 무엇인지 모릅니다.JTextField : 텍스트 필드가 full/autoskip/Auto-Tabbing 일 때 다음 컴포넌트 초점 맞추기

자동 채우기/자동 탭 기능이란 무엇입니까? 텍스트 필드의 길이 제한에 도달하면 자동으로 다음 필드로 이동합니다. (Tab 키 누르기, 다음 구성 요소 초점 맞추기) 또는이 동작에 어떤 이름을 사용합니까?

JTextField.getDocument.addChangeListener() :

나는이 시도 길이와 캐럿 위치를 비교합니다. 사용할 수있는 것 같지만 입력 된 사용자 입력을 JTextField.setText(String) 호출과 구분할 수 없습니다.

gui-refresh로 텍스트를 변경하는 경우에는 포커스를 변경하면 안됩니다.

이것을 구현하는 가장 좋은 방법은 무엇이라고 생각하십니까?

답변

1

Text Field Auto Tab을 참조하십시오.

gui-refresh로 텍스트를 변경하면 포커스를 변경하면 안됩니다.

A)의 removeListener
b)는
c)에 따라 addListener의 setText

편집 : 당신이 ChainDocumentFilter을 필요의 개념처럼 정말 할 경우

, 모든 참조를 제거 그 수업에. 원하는 경우 provideErrorFeedback() 메서드 호출을 Toolkit.beep()으로 바꿀 수 있습니다.

+0

감사합니다. 나는이 솔루션을 좋아합니다! ;) – Synox

3

아마 구성 요소에 add aKeyListener을 입력하고 싶을 것입니다. 길이와 캐럿 위치를 계속 확인할 수는 있지만 키를 누르거나 입력 할 때만 실행됩니다.

귀하의 코드는 다음과 유사하게 보일 수 있습니다

: 코멘트에 반응

addKeyListener(new KeyAdapter(){ 
    public void keyTyped(KeyEvent e) { 
     if (getText().length() >= MAX_LENGTH) { 
      // Move the focus 
     } 
    } 
}); 

편집 :
나는 @의 camickr의 제안을 사용하는 것이 좋습니다 수있는 다음을 만들 리스너에서

private DocumentListener myTabChangeListener; 
@Override 
public void setText(String text) { 
    getDocument().removeDocumentListener(myTabChangeListener); 
    super.setText(text); 
    getDocument().addDocumentListener(myTabChangeListener); 
} 
+0

이 keyTyped-Event를 처리 할 때 문서가 아직 업데이트되지 않았으므로 올바르게 작동하지 않습니다. 나는 길이에 "1"을 더할 수는 있지만 길이가 이미 맞은 Paste-Actions (CTRL-V)를 다루지는 않습니다. – Synox

+0

@Synox, 제 편집 참조. – jjnguy

+1

@Synox, 그렇기 때문에 내가 언급 한 클래스를 만들었습니다. 일반적으로, KeyListener는 사용하지 말아주세요. 그들은 저수준 API를 사용하는 오래된 AWT 애플리케이션을 사용했다. 스윙은 더 진보되어 있으며 삶을 더 쉽게 해주는 더 높은 수준의 API를 가지고 있습니다. – camickr

0

을 플래그 isAPI를 사용하여 코드가 setText()를 호출하는지 여부를 구별합니다. setText() 호출 전에 플래그를 true로 설정하고 다시 설정하십시오.

사실 인 경우에는 아무 것도하지 않고 반대쪽으로 초점을 이동하십시오.

관련 문제