Проверка серии кликов в графическом интерфейсе java swing - PullRequest
1 голос
/ 20 февраля 2010

Я работаю над графическим интерфейсом для шахматной игры, и мне было интересно, есть ли способ проверить серию кликов, например: пользователь нажимает на jPanel, ТОГДА пользователь нажимает на другую jPanel, которая существует в действительном массиве ходов. Я знаю, что мог бы использовать переменную для хранения какого-то состояния, такого как «isSquareClicked = true» или чего-то еще, но я бы предпочел этого, если только это не единственный способ ...

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

Я не вижу ничего плохого в использовании JPanels. Вот моя реализация:

Сначала ChessSquare, это одна ячейка на доске:

public class ChessSquare extends JPanel{
    int x,y;

    public ChessSquare(int x, int y){
        super();
        this.setPreferredSize(new Dimension(50,50));
        this.setBorder(BorderFactory.createLineBorder(Color.black));
        this.x = x;
        this.y = y;
    }
}

Теперь панель основной платы:

public class ChessPanel extends JPanel{
    JPanel positions[][] = new JPanel[8][8];
    ChessSquare move[] = new ChessSquare[2];

    public ChessPanel(){
        initComponents();
    }

    private void initComponents(){
        setLayout(new GridLayout(8,8));

        for(int i=0;i<positions.length;i++){
            for(int j=0;j<positions[i].length;j++){
                ChessSquare square = new ChessSquare(i,j);
                square.addMouseListener(new MouseListener(){
                    public void mouseClicked(MouseEvent me) {
                        ChessSquare cs = (ChessSquare)me.getComponent();
                        if(isValidMove(cs)){

                            System.out.println("Valid move!");
                            System.out.println("x1: "+move[0].x+" y1: "+move[0].y);
                            System.out.println("x2: "+move[1].x+" y2: "+move[1].y);
                            System.out.println("");

                            resetMove();
                        }
                    }

                    //Other mouse events

                });
                positions[i][j] = square;
                add(square);
            }
        }
    }

    private boolean isValidMove(ChessSquare square){
        //here you would check if the move is valid.
        if(move[0] == null){
            move[0] = square;
            return false; //first click
        }else{
            move[1] = square;
        }

        //Other chess rules go here...
        return true;
    }

    private void resetMove(){
        move = new ChessSquare[2];
    }
}

Мы сохраняем матрицу JPanel для представления доски и массив ChessSquare для представления текущего хода. В isValidMove() мы проверяем, завершен ли текущий ход (оба квадрата были нажаты, таким образом, массив перемещения уже имеет один элемент) Когда ход завершен, мы сбрасываем ход и начинаем снова.

1 голос
/ 21 февраля 2010

Я согласен с импом - вы, вероятно, хотите иметь один JPanel и рисовать все на этой панели.

При этом, если кто-то уже реализовал шахматную доску с 8x8 JPanels и велел мне ее использовать, я мог бы попробовать поместить 8x8 JPanels в JLayeredPane, а затем поместить одну прозрачную JPanel поверх все для обработки всех щелчков мыши.

Тем не менее, этот подход потребует от вас использования арифметики Point, чтобы выяснить, по какой ячейке щелкают, и я предполагаю, что смысл использования 8x8 JPanels заключался в том, что вы хотели избежать выполнения такой арифметики в первом место.

1 голос
/ 20 февраля 2010

Насколько я знаю, в Java нет таких вещей.

Но:

1) Как я понимаю, вы используете поле 8x8 JPanels для создания поля для игры?ИМХО это плохой способ.На вашем месте я бы использовал одну панель для создания поля - рисуя на нем все (клетки, фигуры и т. Д.).Это проще, быстрее создавать, легче работать.

2) Возвращаясь к вашему вопросу.Если у вас есть одна панель для поля - вам нужно запомнить только 2 пары координат: где был первый щелчок, а где второй.В Вашем случае - достаточно 2 указателей на панели, на которые вы нажали.;)

Надеюсь, эта помощь:)

...