我正在做一个小纸牌游戏,我遇到了一些问题:当我尝试向我的JLayeredPane中添加动态组件时,它不会显示它们。
我有一个表示卡片的自定义组件,我想以分层的方式显示其中的两个。为此,我有以下课程:
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中测试了这一点,我遇到了以下问题:
CardView组件并将它们添加到默认构造函数的分层窗格中时,父JFrame会很好地显示它们。addDefenceCard方法),它将不会显示添加的组件。revalidate()或repaint()什么都没做。如何让组件显示出来?
发布于 2015-09-25 15:18:35
您的类扩展了JPanel,但是您从未向面板中添加任何组件,因此没有任何可显示的内容。
您需要将JLayeredPane添加到面板中:
layeredPane = new JLayeredPane();
this.add( layeredPane );我不知道您是否需要将布局设置为BoxLayout。面板的默认FlowLayout将尊重添加到它的任何组件的preferredSize。
this.attackCard.setOpaque(true);
this.attackCard.setForeground(Color.black);
this.attackCard.setBorder(BorderFactory.createLineBorder(Color.black));您可能需要考虑在CardView类的构造函数中设置这些属性。这样,默认属性就可以设置在一个地方,并且可以很容易地更改。
您可能需要考虑使用重叠布局,而不是使用分层窗格。它的目的是支持重叠组件的要求。
https://stackoverflow.com/questions/32781510
复制相似问题