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, и у меня возникла следующая проблема:
- Из того, что я понимаю, конструктор по умолчанию всегда вызывается, поэтому, когда я создаю 2 случайных
CardView
компоненты и добавить их на многоуровневую панель в конструкторе по умолчанию родительскогоJFrame
показать их просто отлично. - Если я использую перезаписанный конструктор или пытаюсь добавить другой компонент (например,
addDefenceCard
метод) он не отображает добавленный компонент. - призвание
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. Таким образом, свойства по умолчанию устанавливаются в одном месте и могут быть легко изменены.
Вместо использования многоуровневой панели вы можете рассмотреть возможность использования схемы перекрытия. Он был разработан для поддержки требований перекрывающихся компонентов.