Графический интерфейс для игры в шахматы

Я новый программист с ограниченным опытом. Это мой первый дизайн графического интерфейса. Я пытаюсь создать шахматный графический интерфейс с движущимися значками изображения, и я буду щелкать мышью по координатам стола, которые сначала и во-вторых нажимаются. Но проблема в том, что даже если я определяю методы прослушивания мыши, которые происходят из интерфейса MouseListener, я не могу получить приличные координаты от движения мыши. Я просмотрел значения методов getX и getY объекта MouseEvent и увидел ниже:

mouseEntered (7,3)
mouseExited (3,77)
mouseEntered (3,15)
mouseExited (-1,55)
mouseEntered (61,55)
mouseExited (61,74)
mouseEntered (61,12)
mouseExited (63,33)
mouseEntered (1,33)
mouseExited (6,75)
mouseEntered (6,13)
mouseExited (18,68)
mouseEntered (18,6)
mouseExited (30,70)
mouseEntered (30,8)
mouseExited (62,43)
mouseEntered (0,43)
mouseExited (51,-5)
mouseEntered (51,57)
mouseExited (62,45)
mouseEntered (0,45)
mouseExited (63,17)
mouseEntered (1,17)
mouseExited (32,64)
mouseEntered (32,2)
mouseExited (61,64)
mouseEntered (61,2)
mouseExited (63,15)
mouseEntered (1,15)
mouseExited (-1,25)
mouseEntered (61,25)
mouseExited (-6,49)
mouseEntered (56,49)
mouseExited (-13,50)
mouseEntered (49,50)
mouseExited (-10,34)
mouseEntered (52,34)
mouseExited (8,-6)
mouseEntered (8,56)
mouseExited (1,-7)
mouseEntered (1,55)
mouseExited (13,-4)
mouseEntered (13,58)
mouseExited (57,-1)
mouseEntered (57,61)
mouseExited (62,59)
mouseEntered (0,59)
mouseExited (62,40)
mouseEntered (0,40)
mouseExited (33,-1)
mouseEntered (33,61)
mouseExited (-3,12)
mouseEntered (59,12)
mouseExited (28,-1)
mouseEntered (28,61)
mouseExited (-1,55)
mouseEntered (61,55)
mouseExited (-2,43)
mouseEntered (60,43)
mouseExited (-2,45)
mouseEntered (60,45)
mouseExited (9,62)
mouseEntered (9,0)
mouseExited (62,25)
mouseEntered (0,25)
mouseExited (64,42)
mouseEntered (2,42)
mouseExited (35,64)
mouseEntered (35,2)
mouseExited (62,50)
mouseEntered (0,50)
mouseExited (4,65)
mouseEntered (4,3)
mouseExited (21,63)
mouseEntered (21,1)
mouseExited (47,62)
mouseEntered (47,0)
mouseExited (65,6)
mouseEntered (3,6)
mouseExited (14,-13)
mouseEntered (14,49)
mouseExited (42,-17)
mouseEntered (42,45)
mouseExited (63,-2)
mouseEntered (1,60)
mouseExited (47,64)
mouseEntered (47,2)
mouseExited (63,24)
mouseEntered (1,24)
mouseExited (62,47)
mouseEntered (0,47)
mouseExited (65,24)

Хотя у меня сетка 8x8, я получаю эти координаты. Почему я получаю странные координаты?

Кроме того, я попытался изменить расположение значков изображений с помощью прослушивателей мыши. Из-за получения странных координат я ничего не мог сделать. Код ниже (без методов прослушивания мыши):

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class GUI extends JFrame implements MouseListener {

    private Board auxBoard = new Board(); //8x8 String chess table class
    private JPanel[][] squares = new JPanel[8][8];
    private JPanel mainPanel = new JPanel(new GridLayout(8, 8));
    private Container c;
    private String[][] chessBoard = auxBoard.strChessBoard; //invoke chess table on which game will be played

    private ImageIcon rookBlack = new ImageIcon(System.getProperty("user.dir")
            + "/icons/br.png");
    private ImageIcon rookWhite = new ImageIcon(System.getProperty("user.dir")
            + "/icons/wr.png");
    private ImageIcon bishopBlack = new ImageIcon(
            System.getProperty("user.dir") + "/icons/bb.png");
    private ImageIcon bishopWhite = new ImageIcon(
            System.getProperty("user.dir") + "/icons/wb.png");
    private ImageIcon knightBlack = new ImageIcon(
            System.getProperty("user.dir") + "/icons/bkn.png");
    private ImageIcon knightWhite = new ImageIcon(
            System.getProperty("user.dir") + "/icons/wkn.png");
    private ImageIcon kingBlack = new ImageIcon(System.getProperty("user.dir")
            + "/icons/bk.png");
    private ImageIcon kingWhite = new ImageIcon(System.getProperty("user.dir")
            + "/icons/wk.png");
    private ImageIcon queenBlack = new ImageIcon(System.getProperty("user.dir")
            + "/icons/bq.png");
    private ImageIcon queenWhite = new ImageIcon(System.getProperty("user.dir")
            + "/icons/wq.png");
    private ImageIcon pawnBlack = new ImageIcon(System.getProperty("user.dir")
            + "/icons/bp.png");
    private ImageIcon pawnWhite = new ImageIcon(System.getProperty("user.dir")
            + "/icons/wp.png");

    public GUI() {
        c = getContentPane();
        setBounds(100, 100, 510, 530);
        setBackground(new Color(204, 204, 204));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Tittle");
        setResizable(false);
        c.setLayout(null);
        mainPanel.setBounds(3, 3, 500, 500);
        mainPanel.setBackground(new Color(255, 255, 255));
        c.add(mainPanel);
        this.drawChessBoard();
        this.arrangeChessPieces();
        setVisible(true);
    }

    private void drawChessBoard(){

        for (int y = 0; y < 8; y++)
            for (int x = 0; x < 8; x++){
                squares[y][x] = new JPanel(new BorderLayout());
                squares[y][x].addMouseListener(this);
                mainPanel.add(squares[y][x]);

                if (y % 2 == 0)
                    if (x % 2 != 0)
                        squares[y][x].setBackground(Color.GRAY);
                    else
                        squares[y][x].setBackground(Color.CYAN);
                else
                if (x % 2 == 0)
                    squares[y][x].setBackground(Color.GRAY);
                else
                    squares[y][x].setBackground(Color.CYAN);
            }
    }

    private void arrangeChessPieces() {

        for (int y = 0; y < 8; y++)
            for (int x = 0; x < 8; x++) {
                this.squares[y][x].add(
                        this.getPieceObject(chessBoard[y][x]),
                        BorderLayout.CENTER);
                this.squares[y][x].validate();
            }
    }

    private JLabel getPieceObject(String strPieceName) {

        JLabel lblTemp;

        if (strPieceName.equals("RB"))
            lblTemp = new JLabel(this.rookBlack);
        else if (strPieceName.equals("BB"))
            lblTemp = new JLabel(this.bishopBlack);
        else if (strPieceName.equals("NB"))
            lblTemp = new JLabel(this.knightBlack);
        else if (strPieceName.equals("QB"))
            lblTemp = new JLabel(this.queenBlack);
        else if (strPieceName.equals("KB"))
            lblTemp = new JLabel(this.kingBlack);
        else if (strPieceName.equals("PB"))
            lblTemp = new JLabel(this.pawnBlack);
        else if (strPieceName.equals("RW"))
            lblTemp = new JLabel(this.rookWhite);
        else if (strPieceName.equals("BW"))
            lblTemp = new JLabel(this.bishopWhite);
        else if (strPieceName.equals("NW"))
            lblTemp = new JLabel(this.knightWhite);
        else if (strPieceName.equals("QW"))
            lblTemp = new JLabel(this.queenWhite);
        else if (strPieceName.equals("KW"))
            lblTemp = new JLabel(this.kingWhite);
        else if (strPieceName.equals("PW"))
            lblTemp = new JLabel(this.pawnWhite);
        else
            lblTemp = new JLabel();

        return lblTemp;

    }

    public void mouseClicked(MouseEvent e) {
        System.out.println("mousePressed (" + e.getX() + "," + e.getY() + ")");
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("mousePressed (" + e.getX() + "," + e.getY() + ")");
        repaint();
    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("mouseReleased (" + e.getX() + "," + e.getY() + ")");
    }

    public void mouseEntered(MouseEvent e) {
        System.out.println("mouseEntered (" + e.getX() + "," + e.getY() + ")");
    }

    public void mouseExited(MouseEvent e) {
        System.out.println("mouseExited (" + e.getX() + "," + e.getY() + ")");
    }

    public static void main(String args[]) {
        GUI test = new GUI();
    }

}

Как сделать эти координаты более удобными? Кроме того, как я могу перемещать шахматные фигуры по столу и получать их первое и последнее местоположение в виде координат x, y? Любая помощь приветствуется. Спасибо.


person Sixie    schedule 15.07.2014    source источник


Ответы (2)


Просмотр документации MouseEvent.getY() дает:

Возвращает вертикальное положение y события относительно исходного компонента.

getX() и getY() не имеют ничего общего с квадратами вашей доски, но возвращают значение в пикселях. Точнее, расстояние в направлении y или x от источника.

РЕДАКТИРОВАТЬ: кажется, вы выбрали отдельные квадраты в качестве панелей. Я бы просто назначил отдельный Listener для каждой панели. Таким образом, когда событие запускается, соответствующий слушатель может сообщить вам, что оно было выбрано.

person schrobe    schedule 15.07.2014

Более простой подход состоит в том, чтобы иметь JPanel, представляющий графический интерфейс Board, и у него есть поле участника, которое представляет собой массив JPanel, каждый элемент которого является плиткой доски. Тогда вы можете регистрировать события с каждым тайлом (который должен знать свою координату), и вообще не беспокоиться о переводе координат мыши.

Вы можете посмотреть мою шахматную партию на github для справки, в частности:

https://github.com/amir650/chess/blob/master/code/com/chess/view/GuiTable.java

person Amir Afghani    schedule 15.07.2014