检查java swing GUI中的一系列点击

时间:2010-02-20 17:42:45

标签: java user-interface swing mouseclick-event

我正在制作国际象棋游戏的GUI,我想知道是否有任何方法可以检查一系列点击,例如:用户点击jPanel然后用户点击有效移动数组中存在的另一个jPanel。我知道我可以使用一个变量来存储某种状态,比如“isSquareClicked = true”或者其他东西,但我不愿意,除非这是唯一的方法......

3 个答案:

答案 0 :(得分:2)

我认为使用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 :(得分:1)

据我所知,Java中没有这样的东西。

可是:

1)据我所知,您使用8x8 JPanels字段为游戏创建字段?恕我直言,这是不好的方式。如果我是你,我会使用一个面板来创建场 - 通过在它上面绘画(细胞,图形等)。这样更简单,创建更快,更易于使用。

2)回到你的问题。如果你有一个字段面板 - 你只需要记住2对坐标:第一次点击的位置,第二次的位置。在你的情况下 - 单击面板上的2个指针就足够了。 ;)

希望这有帮助:)

答案 2 :(得分:1)

我同意imp - 您可能希望拥有一个JPanel并在该面板上绘制所有内容。

话虽如此,如果有人已经实现了一个带有8x8 JPanels的棋盘并告诉我使用它,我可能尝试将8x8 JPanel放入JLayeredPane然后将一个透明的JPanel放在顶部处理所有鼠标点击的一切。

尽管如此,这种方法还是要求你使用Point算法来计算出被点击的单元格,并且我猜测使用8x8 JPanels的意思是你想避免在第一次使用那种算术的地方。