2010-01-10 4 views
4

현재 JFrame을 닫기 위해 dispose()를 사용하는 closeWindow() 메소드가 있습니다. 창을 다시 표시 할 때 컨트롤 (텍스트 상자, 목록, 표 등)은 처분 할 때 그 자리에 있었던 이전 값을 여전히 갖습니다. d : 프레임 ... 왜입니까? 프레임을 닫고 지울 수있는 또 다른 방법이 있습니까?Java Swing : dispose() JFrame이 컨트롤을 지우지 않습니다.

다른 JFrame이 다른 창을 표시하는 데 사용하는 코드입니다. 여기에 잘못된 것이 있습니까?

@Action 
public void showAddProductToOrderView() { 

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this); 
    addProductToOrderView.setVisible(true); 
} 
+0

그냥 새 인스턴스를 만듭니다. –

+0

위에서 추가 한 코드가 보이면 addProductToOrderView가 dispose() 된 후 null이 아닙니다. d? 변수를 지우려면 어떻게해야합니까? – Johan

답변

5

창을 삭제해도 하위 텍스트 구성 요소가 지워지지 않습니다. Dispose는 원시 자원을 해제합니다. java.awt.Window의 javadoc도 다음과 같이 표시됩니다.

Window 및 그 하위 구성 요소는 후속 호출 인 pack 또는 show를 사용하여 원시 자원을 다시 작성함으로써 다시 표시 가능하게 만들 수 있습니다. 재 작성된 Window 및 그 서브 컴퍼넌트의 상태는, Window가 파기 된 시점에서의 이러한 오브젝트의 상태와 같습니다 (그러한 액션 간의 추가의 변경은 고려되지 않습니다).

다른 사람들이 제안한 것처럼 대신 매번 새 인스턴스를 만듭니다. 그게 비싸다면보기가 보일 때 하위 구성 요소를 지우는 것이 가장 최선의 방법이라고 생각합니다. setVisible을 재정 의하여

편집 : null 체크를 제거 할 때마다 새 프레임을 만듭니다. 재사용되는 프레임에 따라 다른 뭔가가 있다면

@Action 
public void showAddProductToOrderView() { 
    addProductToOrderView = new AddProductToOrderView(this); 
    addProductToOrderView.setVisible(true); 
}

나는 코드의 나머지 부분에 대해 알고하지 않습니다. 예를 들어, 리스너를 연결 한 경우 리스너가 누출되지 않도록 등록되지 않았는지 확인하십시오.

+0

고마워요! 위의 코드를 보면 변수가 null 인 경우 매번 새 인스턴스를 만들지 않습니까? 나는 dispose()가 변수 null을 렌더링하지 않는다고 가정한다. 새 인스턴스를 만들기 전에 매번 변수를 지울 수 있습니까? – Johan

+1

변수가 코드의 어딘가에 있지 않으면 변수가 null로 설정되지 않습니다. 프레임을 폐기하면 네이티브 리소스 (WindowPeer 등) 만 릴리스되므로 객체에 보관 된 참조에는 영향을 미치지 않습니다. 매번 새 인스턴스를 만들려면 null 확인을 제거하십시오. –

+0

그것은 작동합니다! 정말 고맙습니다! – Johan

3

다시 보여 show()를 사용하기 전에 (생성자를 사용하여) 전체 프레임을 다시 작성하는 것입니다 가장 간단한 것. 그러면 생성자가 생성하고 배치한다고 가정 할 때 완전히 새로운 구성 요소 세트가 제공됩니다.