java overlaylayout项目安排问题

1mrurvl1  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(218)

我在里面放东西有问题 JPanel 哪个有 OverlayLayout 作为布局。我正在制作纸牌游戏,我想要的是有一个关于桌上丢牌的故事。例如,我想有10或12张卡在板上,显示在他们被放置的顺序和重叠的效果。下面是我想要达到的目标的例子:

按照当前向板中添加卡片的代码,当我最多添加10张卡片时,它看起来像:

你可以看到卡片的图形是模糊的,这使得很难读取卡片图形。我添加到电路板上的卡片图像是自定义类的对象,该类扩展了jpanels,其中包含BuffereImage对象:

@SuppressWarnings("serial")
class CardImage extends JPanel
{
    private BufferedImage cardImage;
    private Card card;
    private int index;
    private boolean empty;

    public CardImage(Card _card, boolean clickableCard, Color areaColor, String imagePath)
    {
        if (!imagePath.isEmpty()) {
            try {
                cardImage = ImageIO.read(new File("<path>" + imagePath));
            } catch (IOException e) {
                e.printStackTrace();
            }
            empty = false;
        } else {
            empty = true;
        }
        setSize(71, 96);
        setPreferredSize(new Dimension(71, 96));
        setBorder(null);
        if (clickableCard) {
            setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        }
        setBackground(areaColor);
        card = _card;
        index = 0;
    }

    public void setIndex(int cardIndex)
    {
        index = cardIndex;
    }

    public int getIndex()
    {
        return index;
    }

    public Card getCard()
    {
        return card;
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        if (!empty) {
            g.drawImage(cardImage, 0, 0, cardImage.getWidth(), cardImage.getHeight(), this);
        }
    }
}

注:我知道这看起来很难看,我会纠正,稍后。
我需要添加空白的黑卡作为初始值来填充历史卡堆栈,因为当我一张一张地添加卡时,当没有添加以前的卡时,它会将卡放在错误的位置。我正在使用 setAlignmentX ()用于调整卡在x轴上的位置的功能。为了增加10张卡片,我将校准x设置为每0.1第一张卡片有0.0,第二张0.1,第三张0.2。。。将卡片添加到空面板卡片容器时,它会移动已经放置的卡片。当添加第一张卡(校准x设置为0.0)并且最初没有添加其他卡时,它看起来像:

之后,当添加新卡(对齐度为0.1)时,它会将所有卡向右移动:

添加第三张卡(对齐度为0.3)后,它会再次向右移动所有卡:

所以,这就是为什么我需要首先添加10或5张黑卡,使其看起来像是在卡片包含面板的中心添加卡片,而不是从左侧添加。添加初始卡的代码如下:

boardCardPanel.setMaximumSize(boardCardPanel.getSize());
for (int i = 0; i < 6; i++) {
    CardImage ci;
    ci = new CardImage(Card.CARD_10_CLUB, false, Color.black, "");
    ci.setMaximumSize(ci.getSize());
    ci.setAlignmentX(alignmentX);
    ci.setAlignmentY(0.5f);
    boardCardPanel.add(ci);
    alignmentX += 0.1;
}
boardCardPanel.repaint();
boardCardPanel.setVisible(true);

setVisible(true);
alignmentX = 0f;

增加一张卡的代码是:

private void putCard()
{
    alignmentX = 0.0f;
    try {
        CardImage ci = new CardImage(Card.CARD_10_CLUB, false, Color.BLACK, "\\c"+(cardIndex+2)+".gif");
        ci.setMaximumSize(ci.getSize());
        boardCardPanel.add(ci, 0);
        for (int i = 0; i < boardCardPanel.getComponentCount(); i++) {
            ((CardImage)boardCardPanel.getComponent(i)).setAlignmentX(alignmentX);
            ((CardImage)boardCardPanel.getComponent(i)).setAlignmentY(0.5f);
            alignmentX += 0.2f;
        }
        if (boardCardPanel.getComponentCount() > 6) {
            boardCardPanel.remove(boardCardPanel.getComponentCount()-1);
        }
        System.out.println(boardCardPanel.getComponentCount());
        cardIndex = (cardIndex + 1) % 9;
        boardCardPanel.repaint();
        boardCardPanel.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

所以问题是如何用重叠的图像制作卡片历史,如何调整面板中的重叠缩进,如何在中间制作卡片历史?

ffdz8vbo

ffdz8vbo1#

如何用重叠图像制作卡片历史,如何调整面板中的重叠缩进,如何在中间制作卡片历史?
这是两个不同的问题,所以你需要两个解决方案。
在中心创建卡片历史
方法是嵌套面板,每个面板具有不同的布局管理器,以实现居中效果。
最简单的方法是使用带有 GridBagLayout :

JPanel cardPanel = new CardPanel( some layout manager );
cardPanel.add(...);

JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add(cardPanel, new GridBagConstraints());

frame.add(wrapper, BorderLayout.CENTER);

现在,添加到cardpanel的组件将随着框架大小的变化动态居中于框架中。
使用重叠图像制作卡片历史记录并调整重叠缩进
jdk的默认布局管理器不容易支持重叠。overlaylayout不能对零部件的放置提供很大的控制。
取而代之的是专门为这种布局设计的重叠布局。

相关问题