2012-02-20 5 views
1

첫 번째 UI 작업으로 상위 프레임없이 모달 JDialog를 표시하는 응용 프로그램이 있습니다.모달 부모없는 JDialog가 포커스를 얻지 못합니다.

public LoginDialog(Frame owner, Config config, Object... params) { 
    super((Frame)null, true); 

불행히도 정면에 오더라도 불행히도 초점을 잡지 못하는 성가신 특징이 있습니다.

사용자는 시작 메뉴를 두 번 클릭하여 응용 프로그램을 시작한 후 마우스를 사용하여 "로그인"대화 상자를 선택하고 정보를 입력해야합니다.

JDialog가 포커스를 앞면에 표시 할 때 포커스를 잡는 방법이 있습니까?

invokeLater before, after 및 via를 통해 setVisible (true) 호출 중 "requestFocus"호출을 시도했지만 아무 것도 효과가없는 것으로 보입니다.

어떻게 모달 대화 상자에 포커스를 설정합니까?

업데이트 : 문제는 백그라운드 "대기 창"을 표시하는 데 사용 된 코드입니다. 이 창은 로그인 대화 상자의 "숨겨진"뒤에 해킹으로 표시되어 대화 상자가 사라지면 사용자는 "기다려주십시오"라는 메시지를 보게됩니다. 애플리케이션에 의해 생성 된 첫 번째 창 이었기 때문에 초점이 맞았습니다. 대화 상자가이 해킹으로 이벤트 발송 스레드 내에서 다시 포커스를 얻을 수있는 방법이 있었는지 확실하지 않지만, 해킹을 해지하고 올바르게 처리하여 문제를 해결했습니다.

+0

requestFocus() 대신 [requestFocusInWindow()] (http://docs.oracle.com/javase/1.5.0/docs/api/javax/swing/JComponent.html#requestFocusInWindow())를 사용합니다. 희망이 도움이 될 수 있습니다. –

+0

은 추가 코드 없이도 작동해야합니다. 설명한 문제를 재현 할 수 없습니다. – kleopatra

답변

2

처음에는 모달 대화 상자가 부모가 아닌 것으로 약간 이상합니다. 모달 대화 상자의 요점은 그것이 모체에 표시되고 모체에 접근하는 것을 허용하지 않는다는 것입니다.

그래서 첫 번째 권장 사항은 모달이 아닌 것으로 만드는 것입니다. 나는 그것이 효과가있을 것이라고 믿는다.

나는 그냥 그런 대화 상자를 만들려고 노력했지만 초점에 문제가 없었습니다. 코드를 단순화하는 것이 좋습니다 :

JDialog d = new JDialog(); 
    d.setSize(200, 200); 
    d.setVisible(true); 

이 방법은 저에게 효과적이며, 효과가 있다고 생각합니다. 이제이 간단한 코드를 실제 응용 프로그램 코드로 바꾸기 시작하십시오. 어떤 시점에서 작동이 멈추고 문제가있는 곳을 보게됩니다.

article에 설명 된 트릭을 사용하는 데 아무 도움이되지 않는다면. 제목 "Portable window activation"을 찾으십시오. 나는 그것이 도움이되기를 바랍니다.

+1

예를 들어 인위적인 예제가 작동합니다 ... 로그인 프롬프트 전에 처음 나타나는 "스플래시 화면"이 있습니다. 어떻게 든 초점을 맞춘다. –

1

1) 당신은 JDialog 내용과 invokeLater()

또는 최고의 safiest 방식으로 내부에 랩 보여주는 컨테이너를 만드는 것입니다해야 당신이 ModalityTypes 또는 Modal for parent

3) 하나 설정해야

2) 컨테이너의 경우 Modal 일 수 있습니다. 응용 프로그램 수명주기

2

RequestFocusListener을 사용하여 잠재적 수정 프로그램을 보려면 Dialog Focus을 참조하십시오. 나는 JOptionPane 대화 상자에서 포커스를 성공적으로 설정하는데 사용했습니다.

관련 문제