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() ничего не делает

Как заставить компоненты показывать?

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. Таким образом, свойства по умолчанию устанавливаются в одном месте и могут быть легко изменены.

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

Другие вопросы по тегам