【问题标题】:Updating Jframe based on JLabel Click基于 JLabel Click 更新 Jframe
【发布时间】:2015-06-19 08:52:17
【问题描述】:

我目前正在用 Java 制作“Super Tic-Tac-Toe”应用程序。这是我的目标的描述。 http://mathwithbaddrawings.com/ultimate-tic-tac-toe-original-post。但是我在点击更新 Jframe 时遇到问题。我的应用程序由组成井字游戏板 (JPanels) 的单个单元格 (JLabels) 组成,这些单元格将驻留在 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());

       }
    }
}

现在当 i System.out 它按预期将正确的单元格更改为 O 时。但我不知道如何从这里更新框架,因为 gameFrame 就是由这个组成的。

【问题讨论】:

  • 请贴一些代码。
  • 答案将取决于您将MouseListener 附加到什么,从它的声音来看,它们应该单独附加到标签上
  • @NabeelOmer 那个代码好还是我应该包含包含 JLabel 和 JFrame 的代码?
  • 我想这会很好......
  • @MadProgrammer 我将代码添加到包含侦听器的 OP 中。我可以很好地更改 Board 的状态,但我不知道如何更改顶级图形。

标签: java swing jframe mouselistener


【解决方案1】:

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

干杯。

【讨论】:

  • 你的意思是把监听器放在 cv 数组所属的类中?
  • @RyanStaurt 没有。我的意思是:cv[i][j].addMouseListener(new MouseListener());
  • OP 设置MouseListener 的方式没有任何问题,因为它降低了复杂性并隔离了责任。事实上,OP 可以在构建时将信息传递给侦听器以使其更容易执行其他操作(例如行/列,但如果确实需要,我会将其传递给CellView
  • 这是一种工作方式,使用构造函数,我没有考虑过。
【解决方案2】:

我的问题是告诉框架更新那个单元格。抱歉,我的解释不清楚。

虽然有一些方法可以从 CellView 中找到框架,但这不是必需的,相反,当调用 CellView#setState 时,它应该自己调用 revalidaterepaint

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 2021-09-07
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多