检查 jPanelSquare 中的项目

发布于 2024-12-14 08:48:50 字数 3169 浏览 1 评论 0原文

快问。我有一个 jPanelSquareGrid,在一些方块中带有标签(图像标签,代表棋子),

现在当我将棋子拖放到某个方块时,我想检查其中是否还没有棋子。

有谁知道如何检查 jPanelSquareGrid 中正方形内的现有项目?

提前致谢!

这是我的鼠标事件

   public void mousePressed(MouseEvent e)
{
    chessPiece = null;
    Component c =  chessBoard.findComponentAt(e.getX(), e.getY());

    if (c instanceof JPanel) return;

    Point parentLocation = c.getParent().getLocation();
    xAdjustment = parentLocation.x - e.getX();
    yAdjustment = parentLocation.y - e.getY();
    chessPiece = (JLabel)c;
    chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);

    layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
    layeredPane.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}

/*
**  Move the chess piece around
*/
public void mouseDragged(MouseEvent me)
{
    if (chessPiece == null) return;

    //  The drag location should be within the bounds of the chess board

    int x = me.getX() + xAdjustment;
    int xMax = layeredPane.getWidth() - chessPiece.getWidth();
    x = Math.min(x, xMax);
    x = Math.max(x, 0);

    int y = me.getY() + yAdjustment;
    int yMax = layeredPane.getHeight() - chessPiece.getHeight();
    y = Math.min(y, yMax);
    y = Math.max(y, 0);

    chessPiece.setLocation(x, y);
 }

/*
**  Drop the chess piece back onto the chess board
*/
public void mouseReleased(MouseEvent e)
{
    layeredPane.setCursor(null);

    if (chessPiece == null) return;

    //  Make sure the chess piece is no longer painted on the layered pane

    chessPiece.setVisible(false);
    layeredPane.remove(chessPiece);
    chessPiece.setVisible(true);

    //  The drop location should be within the bounds of the chess board

    int xMax = layeredPane.getWidth() - chessPiece.getWidth();
    int x = Math.min(e.getX(), xMax);
    x = Math.max(x, 0);

    int yMax = layeredPane.getHeight() - chessPiece.getHeight();
    int y = Math.min(e.getY(), yMax);
    y = Math.max(y, 0);

    Component c =  chessBoard.findComponentAt(x, y);

    if (c instanceof JLabel)
    {
        Container parent = c.getParent();
        parent.remove(0);
        parent.add( chessPiece );
        parent.validate();
    }
    else
    {
        Container parent = (Container)c;
        parent.add( chessPiece );
        parent.validate();
    }
}

public void mouseClicked(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

jPanelSquare 是由此类组成的:

class JPanelSquare extends JPanel {
private int rank;
private int file;
private JLabel chessPiece = null;

public JPanelSquare(int rank, int file, Color bkgrnd) {
    this.rank = rank;
    this.file = file;
    setBackground(bkgrnd);
    setLayout(new GridBagLayout());
}

public int getRank() {
    return rank;
}
public int getFile() {
    return file;
}

@Override
public Component add(Component c) {
    chessPiece = (JLabel)c;
    return super.add(c);
}

@Override
public void remove(Component comp) {
    chessPiece = null;
    super.remove(comp);
}

public JLabel getChessPiece() {
    return chessPiece;
}

}

Quick question. I have a jPanelSquareGrid with labels in some squares (image labels, representing chess pieces)

now when I drag and drop a piece to a certain square, I want to check if there isn't already a chesspiece in it.

Does anyone have any idea how I can check a jPanelSquareGrid for existing items inside a square?

Thanks in advance!

here are my mouse events

   public void mousePressed(MouseEvent e)
{
    chessPiece = null;
    Component c =  chessBoard.findComponentAt(e.getX(), e.getY());

    if (c instanceof JPanel) return;

    Point parentLocation = c.getParent().getLocation();
    xAdjustment = parentLocation.x - e.getX();
    yAdjustment = parentLocation.y - e.getY();
    chessPiece = (JLabel)c;
    chessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment);

    layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
    layeredPane.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
}

/*
**  Move the chess piece around
*/
public void mouseDragged(MouseEvent me)
{
    if (chessPiece == null) return;

    //  The drag location should be within the bounds of the chess board

    int x = me.getX() + xAdjustment;
    int xMax = layeredPane.getWidth() - chessPiece.getWidth();
    x = Math.min(x, xMax);
    x = Math.max(x, 0);

    int y = me.getY() + yAdjustment;
    int yMax = layeredPane.getHeight() - chessPiece.getHeight();
    y = Math.min(y, yMax);
    y = Math.max(y, 0);

    chessPiece.setLocation(x, y);
 }

/*
**  Drop the chess piece back onto the chess board
*/
public void mouseReleased(MouseEvent e)
{
    layeredPane.setCursor(null);

    if (chessPiece == null) return;

    //  Make sure the chess piece is no longer painted on the layered pane

    chessPiece.setVisible(false);
    layeredPane.remove(chessPiece);
    chessPiece.setVisible(true);

    //  The drop location should be within the bounds of the chess board

    int xMax = layeredPane.getWidth() - chessPiece.getWidth();
    int x = Math.min(e.getX(), xMax);
    x = Math.max(x, 0);

    int yMax = layeredPane.getHeight() - chessPiece.getHeight();
    int y = Math.min(e.getY(), yMax);
    y = Math.max(y, 0);

    Component c =  chessBoard.findComponentAt(x, y);

    if (c instanceof JLabel)
    {
        Container parent = c.getParent();
        parent.remove(0);
        parent.add( chessPiece );
        parent.validate();
    }
    else
    {
        Container parent = (Container)c;
        parent.add( chessPiece );
        parent.validate();
    }
}

public void mouseClicked(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

jPanelSquare is made of this class:

class JPanelSquare extends JPanel {
private int rank;
private int file;
private JLabel chessPiece = null;

public JPanelSquare(int rank, int file, Color bkgrnd) {
    this.rank = rank;
    this.file = file;
    setBackground(bkgrnd);
    setLayout(new GridBagLayout());
}

public int getRank() {
    return rank;
}
public int getFile() {
    return file;
}

@Override
public Component add(Component c) {
    chessPiece = (JLabel)c;
    return super.add(c);
}

@Override
public void remove(Component comp) {
    chessPiece = null;
    super.remove(comp);
}

public JLabel getChessPiece() {
    return chessPiece;
}

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最舍不得你 2024-12-21 08:48:50

从 stackoverflow 的某处获取类

在我看来,您正在组合来自 2 个不同来源的代码。

我从我发布的 ChessBoard 示例中识别出我的拖动代码。

在我的代码中,很容易判断棋子是否已经存在,因为代码已经在 mouseReleased 代码中执行了此操作。方法末尾的“if 语句”的用途。

我不知道你从哪里得到其他代码,所以我无法对此发表评论。

我建议您坚持使用一种解决方案。

got the class from stackoverflow somewhere

Looks to me like you are combining code from 2 difference sources.

I recoginize my dragging code from the ChessBoard example I've posted.

In my code its easy to tell if a chess piece already exists since the code already does that in the mouseReleased code. The what the "if statement" at the end of the method is for.

I don't know where you got the other code from so I can't comment on that.

I suggest you stick with one solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文