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