2011-01-09 6 views
12

응용 프로그램을 넷빈으로 개발했으며 패널이 표시 될 때 특정 jTextField에 포커스를 설정하려고합니다. 여러 게시물을 읽었으며 다양한 방법을 시도했지만 비 효과적입니다. 주요 쟁점 중 하나는 내 생각에 필요한 코드를 어디에 둘 것인지입니다. this.txtMessage.requestFocusInWindow();텍스트 필드에 포커스 설정

Windows Listener를 사용하는 게시물이 있지만 netbeans가 GUI를 생성했기 때문에 구현 방법을 알 수 없습니다. 인터페이스는 jPANEL 등을 만드는 코드를 편집 할 수 없기 때문에 모든 것이 매우 실망스럽고 정말 어렵다고 생각하지 않습니다.

테스트와 마찬가지로 패널의 버튼에 requestFocusInWindow();을 추가 했으므로 포커스를 원하는 입력으로 설정했습니다.

+1

손으로 만든 스윙 프로젝트에서 NetBeans 코드 생성을 사용하는 것이 훨씬 쉽기 때문에 반드시 사용해야합니다. 개인적으로 이것은 NetBean의 Matisse와 같은 코드 생성기로 복잡한 Swing 프로젝트를 만드는 것이 손으로 코드를 만드는 것보다 훨씬 어렵다고 생각하는 이유 중 하나입니다. –

답변

15

: 윈도우가 이미 표시 한 후 초점을 요청하려는 경우, 당신은 txtMessage.requestFocus()

이 테스트를 위해, 당신은 단지 생성자에서 리스너를 추가 할 수 있습니다 사용한다 패널이 표시 될 때 패널 내의 텍스트 상자에 초점을 맞추어야했습니다. 패널이 응용 프로그램 시작시로드되었으므로 생성자에서 포커스를 설정할 수 없습니다. 패널이로드되지 않거나 쇼에 중점을 두지 않았기 때문에 포커스 요청을 시작하는 이벤트가 없었습니다.

이 문제를 해결하기 위해 텍스트 영역에 requestFocusInWindow()을 호출하는 패널의 메소드를 호출 한 전역 메소드를 메인에 추가했습니다. 다음에 표시 할 단추에 이라는 글로벌 메서드를 호출합니다. 즉, 패널을 표시 한 후 패널이 표시되고 텍스트 영역에 포커스가 지정되었습니다. 그것이 의미 있고 도움이되기를 바랍니다!

또한 디자인보기에서 개체를 마우스 오른쪽 단추로 클릭하고 사용자 지정 코드를 선택하여 대부분 자동 생성 된 코드를 편집 할 수 있지만 패널을 편집 할 수 있다고는 생각하지 않습니다.

10

여기에 뭔가 빠졌는지 확실하지 않지만 패널에 리스너를 추가 할 수 없습니다.

Netbeans에서는 편집기 창의 왼쪽 상단에있는 "소스"버튼을 누르면 대부분의 코드를 편집 할 수 있습니다. 실제 레이아웃 코드는 대부분 잠겨 있지만 필요한 경우 사용자 정의 할 수도 있습니다.

알고있는 한, txtMessage.requestFocusInWindow()은 처음으로 창을 표시 할 때의 기본 포커스를 설정해야합니다. 나는 비슷한 시나리오 곳이 있었다

addWindowListener(new WindowAdapter(){ 
    public void windowOpened(WindowEvent e){ 
    txtMessage.requestFocus(); 
    } 
}); 
+1

requestFocus()를 사용하면 안됩니다. 해당 메소드에 대한 API 설명을 읽으십시오. requestFocusInWindow()는 사용할 적절한 메소드입니다. – camickr

+0

안녕하세요 Riaan과 답장을 보내 주셔서 감사합니다. 문제는 JPanel thats에 초점을 맞추고 싶은 jTextField가 있습니다. 메인 윈도우는 JPanel을로드 할 때 필요에 따라 txtMessage.requestFocus()가 적용되지 않습니다. 메인 윈도우에 윈도우 리스너를 추가하는 것은 텍스트 필드 등이 아닌 JPanel을로드 할 때 시간 낭비처럼 보입니다. – Lee

3

JFrame 또는 JDialog에서는 항상 setVisible() 메서드를 덮어 쓸 수 있습니다. 제대로 작동합니다. 나는 JPanel에서 시도하지 않았지만 대안이 될 수 있습니다. 나를 위해

@Override 
public void setVisible(boolean value) { 
    super.setVisible(value); 
    control.requestFocusInWindow(); 
} 
0

작동을 얻을 수있는 가장 쉬운 방법은, 당신의 프레임 또는 패널 생성자의 아래쪽에 setVisible(true); 라인 후 component.requestFocus(); 줄을 추가하는 것입니다.

이것은 새로운 컴포넌트를 생성하고, 포커스 요청을 요구 한 후, 컴포넌트가 느슨한 포커스를 만들고, 포커스를 이동하게하기 때문에, 모든 컴포넌트가 생성 된 후에 포커스를 묻는 것과 관련이있을 것입니다. 새로 생성 된 구성 요소. 적어도 그것은 내가 생각하는 것입니다.

1

나는 이것을 영원히 간절히 바라며, 마침내 항상 효과가있는 것으로 나타났습니다! 내 윈도우가 JPopupMenu이기 때문에 위의

textField = new JTextField() { 

     public void addNotify() { 
      super.addNotify(); 
      requestFocus(); 
     } 
    }; 
0

없음, 나를 위해 일하지 않는다. 일을 무슨 짓을

이이었다 :

addAncestorListener(new AncestorListener() { 
    @Override 
    public void ancestorAdded(AncestorEvent ae) { 
     myEdit.requestFocus(); 
    } 

    // ... other ancestor listener methods 
} 
0

내가 텍스트 필드에 AncesterAdded 이벤트와 창에서 요청 초점을 설정하여 그것을했다.

+1

몇 가지 예제 코드를 게시 할 수 있습니까? – shieldgenerator7

0

GUINetbeans으로 만들면 자체 작성 코드를 삽입 할 수도 있습니다. 요소 (버튼, 패널 또는 창)를 선택하고 "속성"- 대화 상자에서 "코드"탭을 사용하십시오.

여기에 과 코드를 삽입하여 생성 프로세스의 다양한 부분을 코딩 할 수 있습니다.

"After-All-Set-Code"필드가 코드에 적합하거나 이벤트에 바인딩 할 수 있다고 생각합니다 ("속성"- 대화 상자 -> "이벤트") "componentShown "텍스트 필드/패널.

관련 문제