2012-12-09 5 views
4

스윙에서 프레임 최소화 (아이콘 화) 이벤트를 캡처하는 몇 가지 방법이 있지만 프레임이 화면에서 보이지 않게 된 후 ICONIFIED 인 경우 이벤트가 발생합니다. 즉시 나는 작업 표시 줄 단추를 클릭 할 때 -JFrame을 최소화하기 전에 몇 가지 작업을 수행 할 수 있습니까?

는 지금은 프레임의 실종 전에 몇 가지 코드 를 실행하고 싶습니다.

즉, 은 JFrame이 "나중에"(나중에는 아님) 경우 최소화 할입니다. 이것을 할 수 있습니까?

+0

저는 (매우) 늦었습니다.하지만 다른 것이 효과적이고 이것이 중요하다면, 나는 사용자 정의 최소화/최대화/등으로 꾸며지지 않은 프레임으로 갈 것입니다. 버튼. Btw, 당신은 look & feel을 오버라이드하려고 했습니까 (그 버튼들을 그리는 것은 그것으로 추측합니다) 그리고 거기에서 당신 자신의 프로세싱을 사용합니까? – Matthieu

+0

필자는 이번 주말에 살펴볼 흥미로운 루트이지만 Look & Feel 아이디어는 유일한 실현 가능한 루트 인 것처럼 꾸며지지 않은 프레임 솔루션을 개발 중입니다. 사용 가능한 답안으로 하나 이상의 샘플을 함께 보낼 수 있다면 현상금을 줄 수 있습니다. – glenneroo

답변

3

사용 WindowStateListenerWindowEvent#getNewState()를 호출하고 Frame.ICONIFIED에 대해 확인한다. 여기

는 예입니다 : 질문에

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Frame; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public Test() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 300); 
      } 
     }; 

     frame.add(panel); 

     frame.addWindowStateListener(new WindowAdapter() { 
      @Override 
      public void windowStateChanged(WindowEvent we) { 
       if (we.getNewState() == Frame.ICONIFIED) { 
        System.out.println("Here"); 
       } 
      } 
     }); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 
} 
+2

Mac OS X에서 확인되었습니다. – trashgod

+1

또한 Windows에서 잘 작동하지만 창이 최소화 된 후에도 해당 이벤트가 계속 캐치됩니다. 미안하지만 내 질문이 이해할 수 없을 수도 있지만 강조하려고하는 것은 "최소화하려고하는"경우 무엇인가 잡을 수 있습니까? – shuangwhywhy

+0

super.windowStateChanged (우리)와 내 코드의 위치를 ​​변경하는 경우에도 윈도우가 이미 "ICONIFIED"일 때 여전히 잡혀 있습니다. 여기서 "ICONIFYING"은 "WINDOW_CLOSING"과 같습니다. – shuangwhywhy

0

JFrame을 직접 작성하고 setExtendedState 메서드를 재정의하십시오.

public class MyFrame extends JFrame{ 

    .... 
    setExtendedState(JFrame.ICONIFIED); 
    .... 


@Override 
public void setExtendedState(int state) {  
    // your code 

    super.setExtendedState(state); 
    }; 

} 
+0

감사합니다 Maxim,이 메서드는 물론 setState()를 재정의했지만 작업 표시 줄 단추를 클릭하면 프레임이 사라지고 아무 일도 발생하지 않습니다. – shuangwhywhy

+0

@David, 고맙습니다.하지만 프레임이 시스템에 의해 아이콘 화 될 때 setState() 또는 setExtendedState()가 호출되지 않습니다. -이 문제는 실제로, JFrame undecorated 및 setState() 호출하여 내 자신의 사용자 지정 최소화 단추 첨부 된 및이 방법으로 잘 작동하지만 그것을 최소화하려면 작업 표시 줄을 클릭하면 또 다른 이야기입니다. – shuangwhywhy

0

대답 "그것은 JFrame의 최소화 전에 몇 가지 작업을 수행 할 수 있습니까?"

불행히도이 이벤트를 Java 공간에 보내는 framewindow에 대한 openjdk (windows)의 원시 코드를 확인했습니다. 그리고 그것을 이해, 그것은 Windows API를 VM_SIZE message에서 콜백입니다. SIZE_MINIMIZED은 "창을 최소화했습니다"라는 메시지가 보내지고 실제로 최소화되기 전에 메시지가 나타나지 않습니다.

관련 문제