java - JLayeredPane显示问题

标签 java swing jlayeredpane

我正在开发一个小纸牌游戏,但遇到了一些麻烦:当我尝试将动态组件添加到我的 JLayeredPane 时,它不显示它们。

我有一个代表一张卡片的自定义组件,我想以分层方式显示其中的 2 个卡片。为此,我有以下类(class):

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 组件并将它们添加到默认构造函数中的分层 Pane 时,父 JFrame > 很好地显示它们。
  2. 如果我使用覆盖的构造函数或尝试添加另一个组件(例如 addDefenceCard 方法),它不会显示添加的组件。
  3. 调用 revalidate()repaint() 不会执行任何操作。

如何让组件显示出来?

最佳答案

您的类扩展了 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,而不是使用分层 Pane 。 。它旨在支持重叠组件的需求。

关于java - JLayeredPane显示问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781510/

相关文章:

java - 无法检查 ImageView 是否包含图像

java - ArrayIndexOutOfBoundsException 错误消息

java - JLayered Pane 无法正确显示图像

java - 使用java中的套接字制作简单的客户端/代理/服务器程序

java - 什么是线程安全的 ByteArrayOutputStream?

java - 如何让 JPanel 使用滚动条来适应大型 J 组件?

java - JLayeredPane。动态改变JPanel的图层索引

java - 动态图形用户界面尺寸

java - 使用 Spring Tools Suite 打开 Eclipse 时出错

java - JTextPane#getText() 不返回组件的文本