2012-12-10 2 views
0

순환 참조가 followig 코드에서 두 번 설정되는 이유를 설명 할 수 있습니까?자바 스윙 레이아웃 관리자 순환 참조가 두 번 설정됩니다

//declare panel 
this.cntnrPnl = new JPanel(); 
//define layout manager for the panel - but why circ ref? 
this.cntnrPnl.setLayout(new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS)); 

이유는 JPanel 컨테이너에 다시 BoxLayout 연결을 명시 적으로 대신 JPanel.setLayout의 장면 뒤에 자신을 설정하고 코드 소형화에 대한 BoxLayout에서 세터를 사용하여 수행하는 것이 필요하다?

예컨대 :

this.cntnrPnl.setLayout(new BoxLayout(BoxLayout.Y_AXIS)); 
//and then in JPanel.setLayout have something line 
_layout.setContainer(this); 
+0

순환 참조가 있지만 왜 클라이언트 코드가'Container'를'BoxLayout' 생성자에 전달하여 연결해야하는지에 대한 질문은 아닌 것 같습니다. –

+0

좋은 지적. 문구를 다시 말하자면 – amphibient

+0

OK - 확인해보세요. 잘하면 더 명확 해집니다. – amphibient

답변

2

BoxLayout은 대상 컨테이너에 대한 참조가 필요한 특수 레이아웃이므로 배치됩니다. 모든 레이아웃 관리자의 경우는 아닙니다. setLayout() 메서드에서 BoxLayout에 대한 특정 사례를 추가하는 것은 바람직하지 않습니다. BoxLayout은 건설 후에도 필수 대상 컨테이너가 없기 때문에 BoxLayout이 불안정한 상태에 놓일 것입니다.

반대로 컨테이너 대상에 BoxLayout 생성자 setLayout(this)을 호출하면 해당 작업을 수행 할 수있었습니다. 그러나 나는 왜 그것이 이루어지지 않았는지 모른다.

+0

'BoxLayout' 생성자는 동일한 'Container'에 대해 여러 개의 LayoutManager가있을 수 있기 때문에'setLayout'을 호출 할 수 없습니다. –

+0

아니요. 컨테이너에는 레이아웃 관리자가 하나만있을 수 있습니다. –

+0

나는 서로 다른 시간대에 다른 레이아웃 관리자를 의미했는데, 본질적으로 다른 객체로 setLayout을 호출 할 때마다 차이가 있습니다. –

0

JPanel과 스윙에서 유일하게 사용할 수있는 용기가 아니기 때문에. 특히, 자신 만의 컨테이너 클래스를 만들고 BoxLayout에 대한 특별한 요구 사항을 알지 못할 수도 있습니다. 결과적으로 레이아웃 관리자는 사용자 구현을 위해 작동하지 않습니다.

이제 BoxLayout에 JPanel에 대한 참조가 필요한 이유를 묻는 질문을 할 수 있지만 다른 문제입니다.

+0

당신은 레이아웃 X에 패널 X의 레이아웃을 설정할 수 있지만 컨테이너 Y를 레이아웃의 대상으로 설정할 수 있다는 것을 의미합니까? 난 당신이 레이아웃으로 레이아웃 A를 가지고 패널 X를 설정한다면, 레이아웃 A의 대상은 항상 다른 컨테이너가 아니라 X 여야한다고 생각합니다. – amphibient

+0

아니요, 어떤 시점에서 정의 된 API가 컨테이너 클래스를 구현하면 레이아웃에 삽입된다는 암묵적인 요구 사항이없는 '컨테이너 # setLayout'메소드를 선언했음을 의미합니다. Container가'LayoutManager # setContainer'를 호출하는 계약은 없습니다 (실제로, 대부분의 LayoutManager는 그 메소드를 가지고 있지 않습니다). – sarcan

1

왜이 장면 뒤에 설정 자체를하고 코드 소형화에 대한 BoxLayout에서 세터를 사용하여 다시 JPanel 컨테이너에 명시 적으로 대신 JPanel.setLayoutBoxLayout을 연결하는 것이 필요하다?

당신이 JPanel.setLayout 전화 실제로 Container.setLayout입니다 :

public void setLayout(LayoutManager mgr) 

당신은 BoxLayout 때문에 implements LayoutManager와 메소드를 호출 호출합니다. 그러나 LayoutManager에는 setContainer 메서드가 없으므로 해당 메서드를 추가하지 않으면 작동하지 않습니다. 그러나 대부분의 레이아웃 관리자는 컨테이너에 대해 신경 쓰지 않아서 메소드가 거기에 속하지 않을 것입니다.

BoxLayout 생성자가 마법을 수행 할 수 있습니까? 어쩌면 이 Container에 묶여 있더라도 그 반대가 사실 일 수는 없습니다. 고려 :

this.cntnrPnl = new JPanel(); 
BoxLayout bY = new BoxLayout(this.cntnrPnl, BoxLayout.Y_AXIS); 
BoxLayout bX = new BoxLayout(this.cntnrPnl, BoxLayout.X_AXIS); 

지금 다른 시간에 당신이 this.cntnrPnl.setLayout(bX)this.cntnrPnl.setLayout(bY)를 호출 할 수 있습니다.

모든 옵션을 살펴보면 물론 현재의 API가 가장 좋은 것으로 보입니다. 물론이 모든 것은 다소 주관적입니다.

그런데 cntnrPnl에서 containerPanel으로 이름을 변경하시기 바랍니다. 모음을 없애면 실제로 많은 돈을 절약 할 수 없습니다.

관련 문제