Java——在返回结果之前,等待有效的一系列单击

Java——在返回结果之前,等待有效的一系列单击,java,multithreading,events,user-interface,mouseevent,Java,Multithreading,Events,User Interface,Mouseevent,我正在开发一个Java版的国际象棋。我做了几年的程序员,但从来没有收到过关于面向对象、基于事件编程的很好的解释 这是我的问题:我目前的程序是一个线性的,控制台驱动的游戏,用户输入一种颜色的移动,计算机输入另一种颜色的移动。为此,我有一个通用的“Player”类,它有一个“getMove”方法。HumanPlayer通过控制台输入获得移动,而AIPlayer通过算法生成移动 我现在尝试创建第三种类型的播放器,GUIPlayer,它根据GUI事件生成移动。以下是我希望发生的事情: Game ---(

我正在开发一个Java版的国际象棋。我做了几年的程序员,但从来没有收到过关于面向对象、基于事件编程的很好的解释

这是我的问题:我目前的程序是一个线性的,控制台驱动的游戏,用户输入一种颜色的移动,计算机输入另一种颜色的移动。为此,我有一个通用的“Player”类,它有一个“getMove”方法。HumanPlayer通过控制台输入获得移动,而AIPlayer通过算法生成移动

我现在尝试创建第三种类型的播放器,GUIPlayer,它根据GUI事件生成移动。以下是我希望发生的事情:

Game ---(request for move)---> GUIPlayer --------(request for move)---------> GUI
  ^------(resulting move)--------|<-----(resulting move from click events)-----|
基本上,我希望GUIPlayer等待(playerMove!=null)将其作为移动返回。这听起来像好设计吗?如果是这样,我如何实现它呢?

明白了

原来这是一个基本的等待通知问题。下面是我对ChessPanel的“mouseClicked”方法的最终代码:

对于GUI本身:

    while(cp.getMove() == null) {
        try {
            synchronized(cp) {
                cp.wait();
            }
        } catch (InterruptedException e) {}
    }
这就解决了问题

public void mouseClicked(MouseEvent e) {
    Position clickPosition = getSquare(e.getX(), e.getY());

    if(this.selectedPiece.getType() == PieceType.NONE) {
        // Attempts to select the piece that was just clicked
        Piece piece = b.getPiece(clickPosition);

        if(piece.getType() != PieceType.NONE) {
            this.selectedPiece = b.getPiece(clickPosition);
            this.selectedPiecePosition = clickPosition;
        }
    } else {
        // Attempts to move the selected piece
        try {
            this.playerMove = b.getMove(selectedPiecePosition, clickPosition);
            synchronized(this) {
                this.notify();
            }
        } catch(InvalidMoveException ex) {

        }
        this.selectedPiece = new NonePiece();
        this.selectedPiecePosition = new Position(0, 0);
        updateCurrentHover(e.getX(), e.getY());
    }

    repaint();
}
    while(cp.getMove() == null) {
        try {
            synchronized(cp) {
                cp.wait();
            }
        } catch (InterruptedException e) {}
    }