2015-09-25 84 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

*“如何让组件显示?”*我补充说这是一个问题。如果这是**不是**的问题,请[编辑](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