2009-08-27 2 views

답변

47

(dispose()로) 창을 닫고 (setVisible(false)과) 다른 작업을하는 숨기고, 다른 이벤트를 생산 아직 다른 이벤트를 생성하는 작업.

windowDeactivated 당신에게 창의 포커스를 잃었에게 발생하지만, windowClosing을 생산합니다 OS에서 닫는 동안 dispose()는, windowClosed를 생성합니다. 그렇지 않은, 그래서 일반적으로

window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

setVisible(false)가 다시 창을 사용할 수 있음을 의미한다 : 당신이이 같은 방식을 모두 처리하려면 닫을 때 배치 할 수있는 창을 설정할 수 있습니다 모든 창 이벤트를 게시하십시오 (windowDeactivated은 제외). 창 숨기기를 감지하려면 ComponentListener;

window.addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentHidden(ComponentEvent e) { 
    System.out.println("componentHidden()"); 
    } 
}) 

명시 적으로 setVisible() 호출에 대해서만 작동합니다. 좀 더 일반적으로 숨기기를 감지해야하는 경우 HierarchyListener을 사용할 수 있지만 문제가있는 것보다 더 큰 문제 일 수 있습니다. 당신이 창을 처분 할 때 숨어 먼저, HierarchyEvent의 몇 가지를 얻을 수 있습니다 다음 무효화를 위해,하지만 당신은 setVisible()으로 숨길 때을받지 않습니다 그래서이 여전히 유효하다는

window.addHierarchyListener(new HierarchyListener() { 
    @Override 
     public void hierarchyChanged(HierarchyEvent e) { 
     System.out.println("valid: " + window.isValid()); 
     System.out.println("showing: " + window.isShowing()); 
     } 
    }); 

주 무효화.

+3

David에게 감사드립니다. dispose를 사용할 때 windowClosing만을 듣고있었습니다. OS 폐쇄로 인해 창 폐쇄가 발생했다는 것을 알지 못했습니다. –

+0

나는 어려운 길을 찾아야했다. :) –

+0

그래, 아직 질문을 이해하지 못할 수 있습니다. 하지만 OP는 "와인 더 청취자에게 계속 알림을 보내려고합니다."제 제안은 dispose 메서드를 사용하지 않고 windowClosing 이벤트를 창에 보낸 것입니다.이 작업은 "X"버튼을 클릭 한 것처럼 작동합니다. 윈도우가 삭제되고 윈도우 리스너가 인식 될 것입니다 .2 줄의 코드입니다. 문제가 내가하는 것보다 더 잘 이해하는 것 같습니다. 어쩌면 당신이 내 제안을 테스트하여 이해가가는 지 알 수 있습니다. – camickr

0

테스트되지 않은 제안 :

당신은 getWindowListeners를 시도()하고 반복하는 주위 WindowListeners 각각의 windowClosed()를 해고?

편집 : 위의 제안이 잘못되었습니다. 후손을 위해 그것을 지키십시오.

나는 간단한 예제에서 dialog.dispose()를 호출하는 것이 좋다고 생각합니다.

1

Window에 windowClosing 이벤트를 보냅니다. Closing an Application 항목에서 ExitAction 예제를 확인하십시오.

+3

투표를하지 않을 경우 사람들이 어떻게 배울 수 있습니까? – camickr

+2

제프의 문제를 이해하려고 시도하지 않은 것처럼 보였기 때문에 그것이 아마도 당신의 가장 가능성있는 기존 블로그 게시물에 링크되어있는 것으로 나타 났으므로 아마도 그것을 떨어 뜨린 것은 아닙니다. Jeff에 대한 두 가지 불만을 게시 한 이유는 그에게 효과가없는 이유를 알아 내려고하지 않으면 답변을 좋아하지 않아도 답변 자체가 더 매력적으로 보이지 않습니다. –

+0

나는 왼쪽 필드에서 빠져 나올 수 있다는 것에 동의하지만, 다른 하나를 이해하지 못하는 우리에 대한 내 의견은 내가이 질문을 이해할 수 있도록 여러 번 보았다는 것을 나타냅니다. 제 다른 의견은 제프가 제 제안을 다시 한번 살펴 보도록 고안되었습니다. 나는 여전히 디스플레이되지 않은 패널의 이미지를 생성 할 때 그의 문제에 대한 1 라인 솔루션을 가지고 있다고 주장한다. – camickr

3

문제가없는 것 같습니다. 아래의 코드를 windowDeactivated()으로 사용하면 setVisible(false) 또는 dispose()windowClosed() 중 하나가 호출되며 dispose()도 호출됩니다.

ClosingDialog.java : - 또 다른입니다 운영 체제에서 폐쇄

public class ClosingDialog extends JDialog { 
    public ClosingDialog(Frame owner, String title, boolean modal) { 
     super(owner, title, modal); 
     JPanel contentPanel = (JPanel) this.getContentPane(); 

     JButton setVisButton = new JButton("setVisible(false)"); 
     setVisButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ClosingDialog.this.setVisible(false); 
      } 
     }); 

     JButton disposeButton = new JButton("dispose()"); 
     disposeButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       ClosingDialog.this.dispose(); 
      } 
     }); 

     contentPanel.setLayout(new FlowLayout()); 

     contentPanel.add(setVisButton); 
     contentPanel.add(disposeButton); 

     this.addWindowListener(new WindowListener() { 
      public void windowActivated(WindowEvent e) { 
       System.out.println("windowActivated"); 
      } 

      public void windowClosed(WindowEvent e) { 
       System.out.println("windowClosed"); 
      } 

      public void windowClosing(WindowEvent e) { 
       System.out.println("windowClosing"); 
      } 

      public void windowDeactivated(WindowEvent e) { 
       System.out.println("windowDeactivated"); 
      } 

      public void windowDeiconified(WindowEvent e) { 
       System.out.println("windowDeiconified"); 
      } 

      public void windowIconified(WindowEvent e) { 
       System.out.println("windowIconified"); 
      } 

      public void windowOpened(WindowEvent e) { 
       System.out.println("windowOpened"); 
      } 
     }); 

     this.setSize(300, 300); 
    } 
} 
+2

모두 windowDeactivated는 포커스가 손실되었음을 의미합니다. 창문이 실제로 닫혔는지 확실하지 않습니다. 일반적으로 WindowListeners는 창 닫기 이벤트를 수신하여 닫을 때 특별한 처리를 수행 할 수 있습니다. – camickr

+0

예, windowClosing을 시도했지만 해당 이벤트를받지 못했습니다. –

+0

그래서 5 시간 전에 해결책을주었습니다. – camickr

0

JDialog에 추가 닫기 버튼이있어서 (동일한 코드를 사용하여 구현 한 동일한 WindowListener가 필요하기 때문에) 코드에서 windowClosing 이벤트를 코드에서 실행하고 싶습니다 (사용자가 X를 클릭 한 것처럼). X를 클릭하고 버튼을 클릭하면 실행됩니다. 실행중인 dispose()windowClosed이 아니고 windowClosing이 아니며 메시지를 표시하려면 전에 전에 확인을 위해 창을 닫아야합니다.나는 또한 보호되기 때문에 windowClosing을 JDialog의 방법 processWindowEvent을 통해 발사 할 수 없었습니다. 사람을 도움이

WindowAdapter adapter = (WindowAdapter)jdialog.getWindowListeners()[0]; 
adapter.windowClosing(new WindowEvent((Window)jdialog, WindowEvent.WINDOW_CLOSING)); 

희망 : 여기

는 그래도 난 일을 가지고하는 방법입니다.

관련 문제