基于JLabel Click更新Jframe

时间:2015-06-18 23:46:25

标签: java swing jframe mouselistener

我目前正在制作一个超级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就是由它构成的。

2 个答案:

答案 0 :(得分:0)

首先,停止为MouseListener使用单独的类,这是您的问题的根源。直接向cv[i][j]添加鼠标监听器。您将能够更新您的帧,因为现在鼠标侦听器也在同一个类中。

干杯。

答案 1 :(得分:0)

  

我的问题在于告诉Frame更新该单元格。对不起,我的解释不清楚。

虽然有很多方法可以从CellView找到这个框架,但这不是必需的,而是在调用CellView#setState时,它应该调用revalidaterepaint本身