微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java OverlayLayout 项目排列问题

如何解决Java OverlayLayout 项目排列问题

我在将对象放置在 JPanel 内时遇到问题,其中 OverlayLayout 作为布局。我正在创建纸牌游戏,我想要的是在桌子上有一个掉纸牌的故事。例如,我希望有 10 或 12 张卡片,按照它们的放置顺序显示并具有重叠效果。这是我想要实现的以下示例:

enter image description here

使用将卡片添加到板的当前代码,当我添加最多 10 张卡片时,它看起来像:

enter image description here

您可以看到卡片数字被遮挡,这使得阅读卡片数字变得困难。 我添加到板上的卡片图像是自定义类的对象,它使用内部的 BufferedImage 对象扩展 JPanel:

@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,cardImage.getWidth(),cardImage.getHeight(),this);
        }
    }
}

注意:我知道这看起来很丑我稍后会更正。

我需要添加空的黑色卡片作为初始来填充历史卡片堆,因为当我一张一张地添加卡片时,当没有添加以前的卡片时,它会将卡片放在错误的位置。我正在使用 setAlignmentX() 函数来调整 X 轴上的卡片位置。为了添加 10 张卡片,我将对齐 X 设置为每 0.1 第一张卡片有 0.0,第二张卡片有 0.1,第三张卡片有 0.2,...当将卡片添加到空面板卡片容器时,它会移动已经放置的卡片。添加第一张卡片(对齐 X 设置为 0.0)并且最初没有添加其他卡片时,它看起来像:

enter image description here

然后在添加新卡(对齐为 0.1)时将所有卡向右移动:

enter image description here

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

enter image description here

所以这就是为什么我最初需要添加 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,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();
    }
}

那么问题是如何使用重叠图像制作卡片历史并调整面板中的重叠缩进并在中心制作卡片历史?

解决方法

如何使用重叠图像制作卡片历史并调整面板中的重叠缩进并在中心制作卡片历史?

这是两个不同的问题,所以你需要两个解决方案。

在中心制作卡片历史

解决这个问题的方法是嵌套面板,每个面板都有不同的布局管理器来实现居中效果。

最简单的方法是让包装面板带有 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 不能让您对组件放置进行太多控制。

相反,请查看专为此类布局设计的 Overlap Layout

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。