我目前正在制作一个超级Tic-Tac-Toe" Java中的应用程序。这是对我的目标的描述。 http://mathwithbaddrawings.com/ultimate-tic-tac-toe-original-post。但是我在点击时更新Jframe时遇到问题。我的应用程序由构成Tic-Tac-Toe板(JPanels)的单个单元(JLabel)组成,它们将驻留在JFrame中。
我的问题是在MouseClick上使用 getSource 只会让我像我的JPanel一样渗透,而且我无法访问按下了井字网格的哪个单元格。有没有办法用我目前组织这个项目的方法检查哪一个被按下了?
以下是查看包含听众的ticTacToe Board的“我的代码”:
public class TicTacToeView extends JPanel {
public CellView[][] cv;
public TicTacToe ttt;
public TicTacToeView(TicTacToe t) {
int rows = 3;
int columns = 3;
cv = new CellView[3][3];
ttt = t;
setSize(3 * 64, 3 * 64);
setBackground(Color.white);
setLayout(new GridLayout(rows, columns));
setVisible(true);
setFocusable(true);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j ++) {
System.out.println(ttt.getCellAt(i, j).toString());
cv[i][j] = new CellView(ttt.getCellAt(i, j));
cv[i][j].addMouseListener(new yourListener());
add(cv[i][j]);
}
}
setVisible(true);
}
public String toString() {
return ttt.toString();
}
public class yourListener extends MouseAdapter{
public void mouseClicked(MouseEvent e){
CellView labelReference=(CellView)e.getSource();
Cell cellClicked = labelReference.getCell();
System.out.println(cellClicked.getCol() +"," + cellClicked.getRow());
cellClicked.setState(CellState.O);
ttt.setCellAt(cellClicked.getCol(), cellClicked.getRow(), CellState.O);
System.out.println(ttt.toString());
}
}
}
现在当我使用System.out时,它会按预期将正确的单元格更改为O.但是我不知道如何从这里更新框架,因为gameFrame就是由它构成的。
答案 0 :(得分:0)
首先,停止为MouseListener
使用单独的类,这是您的问题的根源。直接向cv[i][j]
添加鼠标监听器。您将能够更新您的帧,因为现在鼠标侦听器也在同一个类中。
干杯。
答案 1 :(得分:0)
我的问题在于告诉Frame更新该单元格。对不起,我的解释不清楚。
虽然有很多方法可以从CellView
找到这个框架,但这不是必需的,而是在调用CellView#setState
时,它应该调用revalidate
和repaint
本身