2013-04-15 10 views
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 имеют компоненты, такие как кнопки, и т.д ...

Вопрос заключается в том, что, когда я добавляю как JPanels к JLayeredPane, ничего не появляется.

Я попытался изменить расположение JLayeredPane().

Например, я сделал:

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

Затем JPanels действительно показывают, но они показаны смежный, не уважая слои JLayeredPane.

Я вынужден использовать нулевой макет?

Как я могу заставить JLayeredPane уважать слои и показывать мои два BoxLayout JPanels правильно?

Когда я даю свой JLayeredPane макет, он показывает панели, но он не уважает слои вообще.

+2

** НИКОГДА ** не используйте макет «нуль». – syb0rg

+0

Это проблема: http://docs.oracle.com/javase/tutorial/uiswing/components/problems.html#layeredpane - Второй аргумент 'add()' должен быть 'Integer', а не 'int ', поскольку версия' int' метода отличается. –

+0

Когда я не устанавливаю макет, ничего не появляется. Когда я добавляю какой-либо макет, он просто ведет себя так, как будто он не является слоистой, и добавляет компоненты, смежные друг с другом визуально, а не один поверх другого. – ThePrince

ответ

4

Вам нужен менеджер макетов, который понимает Z-ось. Менеджеры макета по умолчанию не понимают Z-ось JLayeredPane.

Если вы просто хотите наложить материал друг на друга вы можете использовать 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 Класс:

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

Панель со слоями действует, как если бы это было с помощью нуль раскладка. Вы должны указать размер и положение JPanel при добавлении его в 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.setSize(lp.getPreferredSize()); 
p2.setSize(lp.getPreferredSize()); 
0

У меня была аналогичная проблема. Вместо прохождения слоя при добавлении к панели, попробуйте сделать это отдельно:

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

Слои должны быть определены перед добавлением компонентов. Вы также можете попытаться использовать JLayeredPane.DEFAULT_LAYER вместо 0.

В моем случае у моей JLayeredPane был GridBagLayout, я не знаю, работает ли он по умолчанию.