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