2015-09-25 20 views
0

Я работаю над маленькой карточной игрой, и у меня были некоторые проблемы: когда я пытаюсь добавить динамические компоненты в свой JLayeredPane, он не отображает их.Проблемы с отображением JLayeredPane

У меня есть пользовательский компонент, который представляет собой карту, и я хочу отобразить 2 из них в многоуровневой форме. Для этого у меня есть следующий класс:

public class PairView extends JPanel { 

private JLayeredPane layeredPane; 
private CardView attackCard; 
private CardView defenceCard; 
private static Point origin = new Point(0, 0); 
private static int offset = 10; 

public PairView() { 
} 

public PairView(Card attackCard) { 

    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 

    layeredPane = new JLayeredPane(); 
    layeredPane.setPreferredSize(new Dimension(120, 170)); 
    this.defenceCard = null; 
    this.attackCard = new CardView(attackCard); 


    this.attackCard.setOpaque(true); 
    this.attackCard.setForeground(Color.black); 
    this.attackCard.setBorder(BorderFactory.createLineBorder(Color.black)); 
    this.attackCard.setBounds(origin.x, origin.y, 100, 150); 


    layeredPane.add(this.attackCard, 0); 
    this.origin.x += offset; 
    this.origin.y += offset; 
} 
public void addDefenceCard(Card defenceCard) throws DurakException { 
    if (this.defenceCard == null) { 
     this.defenceCard = new CardView(defenceCard); 

     this.defenceCard.setOpaque(true); 
     this.defenceCard.setForeground(Color.black); 
     this.defenceCard.setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.defenceCard.setBounds(origin.x, origin.y, 100, 150); 
     layeredPane.add(this.defenceCard, 1); 
    } else { 
     throw new DurakException("A defence Card is already present"); 
    } 

} 

Я испытал это через перетаскивания интерфейса в NetBeans и у меня есть следующая проблема:

  1. Из того, что я понимаю, конструктор по умолчанию всегда вызываемый, поэтому, когда я создаю 2 случайных компонента CardView и добавляю их на многоуровневую панель в конструкторе по умолчанию, родительский JFrame отображает их просто отлично.
  2. Если я использую перезаписанный конструктор или пытаюсь добавить другой компонент (например, метод addDefenceCard), он не отображает добавленный компонент.
  3. , вызывающий revalidate() или repaint() ничего не делает.

Как получить компоненты для показа?

+0

* «Как получить компоненты для показа?» * Я добавил это как вопрос. Если это ** не ** вопрос, пожалуйста, [edit] (http://stackoverflow.com/posts/32781510/edit) и добавьте один .. –

ответ

1

Ваш класс расширяет JPanel, но вы никогда не добавляете какие-либо компоненты в панель, поэтому ничего не видно.

Вы должны добавить JLayeredPane к панели:

layeredPane = new JLayeredPane(); 
this.add(layeredPane); 

Я не знаю, если необходимо установить на расположение к BoxLayout. По умолчанию FlowLayout панели будет уважать предпочтительный размер любого добавленного к нему компонента.

this.attackCard.setOpaque(true); 
this.attackCard.setForeground(Color.black); 
this.attackCard.setBorder(BorderFactory.createLineBorder(Color.black)); 

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

Вместо использования слоистой панели вы можете рассмотреть возможность использования Overlap Layout. Он был разработан для поддержки требований к перекрывающимся компонентам.

+0

Thnx много. Настройка свойств в классе CardView - хороший вызов – user2302702

Смежные вопросы