JLayeredPane显示问题
JLayeredPane display problems
我正在开发一个小纸牌游戏,但遇到了一些麻烦:当我尝试向我的 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 中的 拖放界面 对此进行了测试,我遇到了以下问题:
- 据我所知,默认构造函数总是被调用,所以当我创建 2 个随机
CardView
组件并将它们添加到默认构造函数中的分层窗格时,父 JFrame
只显示它们很好。
- 如果我使用覆盖的构造函数或尝试添加另一个组件(如
addDefenceCard
方法),它不会显示添加的组件。
- 调用
revalidate()
或 repaint()
没有任何作用。
如何让组件显示?
您的 class 扩展了 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 的构造函数中设置这些属性 class。这样默认属性设置在一个地方,可以很容易地改变。
您可能要考虑使用 Overlap Layout 而不是使用分层窗格。它旨在支持重叠组件的要求。
我正在开发一个小纸牌游戏,但遇到了一些麻烦:当我尝试向我的 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 中的 拖放界面 对此进行了测试,我遇到了以下问题:
- 据我所知,默认构造函数总是被调用,所以当我创建 2 个随机
CardView
组件并将它们添加到默认构造函数中的分层窗格时,父JFrame
只显示它们很好。 - 如果我使用覆盖的构造函数或尝试添加另一个组件(如
addDefenceCard
方法),它不会显示添加的组件。 - 调用
revalidate()
或repaint()
没有任何作用。
如何让组件显示?
您的 class 扩展了 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 的构造函数中设置这些属性 class。这样默认属性设置在一个地方,可以很容易地改变。
您可能要考虑使用 Overlap Layout 而不是使用分层窗格。它旨在支持重叠组件的要求。