2009-11-15 4 views
0

여러 개의 JIF를 여는 응용 프로그램이 있지만 JIF의 단일 인스턴스 만 만들고 싶습니다. 그래서이 함수를 사용하여 확인하고 키를 누른 후에 JIF를 닫습니다 (JDesktopPane.getSelectedFrame() .dispose()). 그러나 2 ~ 3 회 연속 폐기하면 새로운 JIF가 생성되지 않습니다. 내가 여기서 잘못하고있는거야?JInternalFrame의 단일 인스턴스를 유지 관리 하시겠습니까?

public static void setInternalFrame(final JInternalFrame internalFrame) { 
    log.debug("CurActiveInternalFrame " + ShoppyPOSApp.getCurrentActiveInternalFrame(), null); 
    log.debug("Incoming internalFrame " + internalFrame, null); 

    boolean isFrameFound = false; 
    try { 
     // Have a check whether the DesktopPane contains the internal Frame 
     // If yes bring it to front and set the focus 
     for (int i = 0; i < ShoppyPOSApp.frame.mainDesktopPane.getAllFrames().length; i++) { 
      if (ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i].getClass() == internalFrame.getClass()) { 
       isFrameFound = true; 
      } 
     } 

     if (!isFrameFound) { 
      internalFrame.setVisible(true); 
      internalFrame.setLocation(
       ShoppyPOSApp.frame.mainDesktopPane.getWidth()/ 2 - internalFrame.getWidth()/2, 
       ShoppyPOSApp.frame.mainDesktopPane.getHeight()/2 - internalFrame.getHeight()/2 
      ); 
      ShoppyPOSApp.frame.mainDesktopPane.add(internalFrame); 
     } 
     internalFrame.setSelected(true); 
    } catch (Exception e) { 
     log.debug(e.toString(), null); 
    } 
} 

답변

1

for 루프에서 입력 매개 변수의 클래스와 데스크톱 내부 프레임을 비교하고 있습니다. 이것은 매개 변수가 JInternalFrame의 인스턴스이고 getAllFrames 메소드가 JInternalFrames의 배열을 리턴하므로 항상 유효합니다. 정기적 인 비교 만하는 것이 아닙니다. :

ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame 

나는 프레임에 당신의 default close operationHIDE_ON_CLOSE를 사용하여 키 리스너 대신 dispose()setVisible(false)를 사용하는 것이 좋습니다 것입니다. 프레임이 배치되면 프레임이 닫히고 프레임이 닫힌 후에 프레임을 다시 시도해서는 안됩니다. 프레임을 그냥 숨기면 여전히 데스크톱 창의 자식이되므로 setInternalFrame 메서드에서 프레임을 찾을 때 setVisible(true)에 대한 호출을 추가합니다.

불규칙적 인 동작을하는 것처럼 들리지만 (2 ~ 3 개를 처분하면 오류가 발생한다고 말함) 이것은 나에게 이벤트 스레드 문제가 있음을 시사합니다. 이벤트 스레드에서 setInternalFrame이 호출 되었습니까? Event Dispatch Thread에 익숙하며 올바르게 사용하고 있습니까?

1

나는 dispose이 (가) 의미하는 것을 수행하고 있다고 생각하지 않습니다. dispose은 프레임의 운영 체제 "피어"를 제거합니다. 그러나 그 프레임을 다시 보여주고 자한다면, 그 토대를 버려서는 안됩니다!

나는 그것을 감추기 위해 setVisible(false)을 JIF에 달았습니다. 그런 다음 setVisible(true)으로 다시 활성화 할 수 있습니다.

관련 문제