문제
간단한 질문 :
스윙 프레임이 완전히 모달이 될 수 있습니까 (다른 모든 Windows를 차단)?
다음을 시도했지만 여전히 다른 앱 Windows (이 브라우저와 같은)를 클릭 할 수 있습니다.
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
가능하면 몇 가지 코드를 붙여 넣으십시오.
해결책
JFrame은 모달로 설계되지 않았습니다. JDialog를 사용하지만 JFRAME 기능을 잃게됩니다. 손실로 살 수 없다면, 이벤트 큐를 차단하고 차단에서만 이벤트 만 수락하기 위해 자신의 것으로 교체해야합니다.
보다 모달 내부 프레임 생성 JFrame에도 적용 할 수있는 내부 프레임을 사용하여 설명합니다.
편집 : OUPS, 내 대답은 약간 꺼져있는 것 같습니다. 코드 예제에서 이미 대화 상자 서브 클래스를 사용하고 있음을 보여주기 때문입니다.
다른 팁
대화는 전 세계적으로 모달이 아닙니다. 모든 현대의 OS는 그 히그의 글로벌 양식을 강력하게 낙담 시키며 (작동 할 수 없다는 사실에 의해 지적 된 바와 같이) 기능을 더 이상 사용하지 않았을 수도 있습니다. 앱이 있어야합니다 절대 전체 시스템에서 이벤트를 훔치십시오. 그것은 나쁜 디자인 일뿐 만 아니라 내 책에서 거의 범죄입니다.
대부분의 사람들이 여러 앱 사이의 멀티 태스킹을 좋아한다는 사실을 무시하면 전 세계 모달 대화 상자를 열고 응용 프로그램이 정지되는 시나리오는 어떻습니까? ctrl+alt+del은 앱을 죽이기 위해 Windows에서 작동하지만 전 세계 모달 대화 상자가있는 Mac에서 CMD+OPT+Escape에 대해 잘 모르겠습니다 (Cocoa조차도 가지다 글로벌 양식?). Linux 플랫폼 중 어느 것도 제안한 것처럼 UI를 완전히 제어 한 앱을 죽이는 멋진 방법이 없습니다 (X11을 완전히 죽이고 새로운 인스턴스를 처음부터 시작해야 함).
내 대답 : 다른 방법을 찾으십시오. 나는 당신의 의뢰인이 무엇을 요구하는지 상관하지 않습니다. 그들은 이것을 원하지 않습니다.
글로벌 모달에 대해 잘 모르겠지만 여기에 아이디어가 있습니다.
- 데스크탑의 스크린 샷을 찍으십시오.
- 전체 화면으로 가십시오.
- 대화 상자를 나타냅니다.
데스크탑은 가짜 스크린 샷이므로 클릭하려는 시도를 무시할 수 있습니다.
private void toggleFullScreenWindow() {
GraphicsEnvironment graphicsEnvironment
= GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice
= graphicsEnvironment.getDefaultScreenDevice();
if(graphicsDevice.getFullScreenWindow()==null) {
dialog.dispose(); //destroy the native resources
dialog.setUndecorated(true);
dialog.setVisible(true); //rebuilding the native resources
graphicsDevice.setFullScreenWindow(dialog);
}else{
graphicsDevice.setFullScreenWindow(null);
dialog.dispose();
dialog.setUndecorated(false);
dialog.setVisible(true);
dialog.repaint();
}
requestFocusInWindow();
}
참고 : 전체 화면 독점 모드 API.