1

나는 JLayeredPane을 가지고 있습니다. 내 프로그램은 다음과 같이 뭔가를 작동합니다JLayeredPane은 레이어를 존중하지 않습니다.

JPanel p1 = new JPanel(new BoxLayout(p1, BoxLayout.X_AXIS)); 
JPanel p2 = new JPanel(new BoxLayout(p2, BoxLayout.Y_AXIS)); 
JLayeredPane lp = new JLayeredPane(); 
lp.add(p1, 1); 
lp.add(p2, 0); 

모두 P1과 P2는 등의 버튼과 같은 구성 요소가 ...

문제는 내가의 JLayeredPane에 모두 JPanel의를 추가 할 때, 아무것도 표시하지 않을 것입니다.

JLayeredPane() 레이아웃을 변경해 보았습니다.

lp.setLayout(new BoxLayout(lp, BoxLayout.X_AXIS)); 

는 다음, JPanel의 보여,하지만 그들은의 JLayeredPane의 층을 존중하지 인접한 같습니다

예를 들어, 내가 그랬어.

널 레이아웃을 사용해야합니까?

어떻게하면 JLayeredPane이 레이어를 존중하게하고 두 개의 BoxLayout JPanels를 올바르게 표시 할 수 있습니까?

JLayeredPane에 레이아웃을 지정하면 패널이 표시되지만 레이어를 전혀 고려하지 않습니다.

+2

** 절대 'null'레이아웃을 사용하지 마십시오. – syb0rg

+0

이것이 문제입니까? http://docs.oracle.com/javase/tutorial/uiswing/components/problems.html#layeredpane - 'add()'의 두 번째 인수는 'Integer'여야하며 메소드의'int' 버전으로서'int'는 다릅니다. –

+0

레이아웃을 설정하지 않으면 아무 것도 나타나지 않습니다. 레이아웃을 추가하면 레이어 페인이 아닌 것처럼 동작하고 다른 컴포넌트 위에 하나가 아닌 시각적으로 서로 인접한 컴포넌트를 추가합니다. – ThePrince

답변

4

Z 축을 인식하는 레이아웃 관리자가 필요합니다. 디폴트의 ​​레이아웃 매니저는, JLayeredPane의 Z 축을 인식하지 않습니다.

당신은 단순히 서로의 상단에 물건을 오버레이하려면이 같은 LayoutManager에 사용할 수 있습니다

JLayeredPane layeredFooPane = new JLayeredPane(); 
// The magic! 
layeredFooPane.setLayout(new LayeredPaneLayout(layeredPane)); 
// Add components: 
layeredFooPane.add(fooComponent, new Integer(JLayeredPane.DEFAULT_LAYER + 10)); 
layeredFooPane.add(barComponent, JLayeredPane.DEFAULT_LAYER); 

의 LayoutManager 클래스 :이 널 (null)을 사용하는 것처럼

public class LayeredPaneLayout implements LayoutManager { 

    private final Container target; 
    private static final Dimension preferredSize = new Dimension(500, 500); 

    public LayeredPaneLayout(final Container target) { 
      this.target = target; 
    } 

    @Override 
    public void addLayoutComponent(final String name, final Component comp) { 
    } 

    @Override 
    public void layoutContainer(final Container container) { 
      for (final Component component : container.getComponents()) { 
        component.setBounds(new Rectangle(0, 0, target.getWidth(), target.getHeight())); 
      } 
    } 

    @Override 
    public Dimension minimumLayoutSize(final Container parent) { 
      return preferredLayoutSize(parent); 
    } 

    @Override 
    public Dimension preferredLayoutSize(final Container parent) { 
      return preferredSize; 
    } 

    @Override 
    public void removeLayoutComponent(final Component comp) { 
    } 
} 
+0

당신, 선생님, 천재세요 !! – ThePrince

+0

잘 작동합니다. 비록 내가이 레이어들 각각에 컴포넌트를 가지고있을 때, 아래 레이어의 컴포넌트 중 일부가 맨 위에 놓여 지려고 할 때 (커서를 가져 가면) 문제가 발생합니다. 결국이 레이어의 모든 구성 요소를 비활성화 (setEnabled(false))로 설정하여이 동작을 제거 할 수 있습니다. 왜냐하면 현재 숨겨져있는 경우 비즈니스가 활성화되어 있지 않기 때문입니다. 추가 오버 헤드가 추가됩니다. –

3

JLayeredPane의 사도 행전 형세. JLayeredPane에 추가 할 때 JPanel의 크기와 위치를 지정해야합니다. 몇 번만 내가 추천 할 것입니다 :

JPanel p1 = new JPanel(new BoxLayout(p1, BoxLayout.X_AXIS)); 
JPanel p2 = new JPanel(new BoxLayout(p2, BoxLayout.Y_AXIS)); 
JLayeredPane lp = new JLayeredPane(); 
lp.add(p1, 1); 
lp.add(p2, 0); 

p1.setSize(lp.getPreferredSize()); 
p2.setSize(lp.getPreferredSize()); 
0

나는 비슷한 문제를 겪고있었습니다. 창을 추가 할 때 레이어를 전달하는 대신 별도로 작업 해보십시오.

lp.setLayer(p1, 1); 
lp.setLayer(p2, 0); 
lp.add(p1); 
lp.add(p2); 

레이어를 정의해야 구성 요소를 추가 할 수 있습니다. 또한 0 대신 JLayeredPane.DEFAULT_LAYER를 사용해 볼 수도 있습니다.

내 경우에는 JLayeredPane에 GridBagLayout이 있는데, 기본 레이아웃으로 작동하는지 모르겠습니다.

관련 문제