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