首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JLayeredPane显示问题

JLayeredPane显示问题
EN

Stack Overflow用户
提问于 2015-09-25 11:47:00
回答 1查看 211关注 0票数 0

我正在做一个小纸牌游戏,我遇到了一些问题:当我尝试向我的JLayeredPane中添加动态组件时,它不会显示它们。

我有一个表示卡片的自定义组件,我想以分层的方式显示其中的两个。为此,我有以下课程:

代码语言:javascript
复制
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. 据我所知,默认构造函数总是被调用的,所以当我创建两个随机的CardView组件并将它们添加到默认构造函数的分层窗格中时,父JFrame会很好地显示它们。
  2. 如果我使用覆盖构造函数或尝试添加另一个组件(如addDefenceCard方法),它将不会显示添加的组件。
  3. 打电话给revalidate()repaint()什么都没做。

如何让组件显示出来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-25 15:18:35

您的类扩展了JPanel,但是您从未向面板中添加任何组件,因此没有任何可显示的内容。

您需要将JLayeredPane添加到面板中:

代码语言:javascript
复制
layeredPane = new JLayeredPane();
this.add( layeredPane );

我不知道您是否需要将布局设置为BoxLayout。面板的默认FlowLayout将尊重添加到它的任何组件的preferredSize。

代码语言:javascript
复制
this.attackCard.setOpaque(true);
this.attackCard.setForeground(Color.black);
this.attackCard.setBorder(BorderFactory.createLineBorder(Color.black));

您可能需要考虑在CardView类的构造函数中设置这些属性。这样,默认属性就可以设置在一个地方,并且可以很容易地更改。

您可能需要考虑使用重叠布局,而不是使用分层窗格。它的目的是支持重叠组件的要求。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32781510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档