Java JButton子项不更新文本

Java JButton子项不更新文本,java,swing,user-interface,jbutton,Java,Swing,User Interface,Jbutton,我正在构建一个游戏,游戏的目标是让一名骑士环游世界,并能够与其他骑士作战 我有一个主要的班级,开始游戏: public class Main { public static void main(String[] args) { new Game(); } } 创建JFrame的类游戏: import java.awt.GridLayout; import javax.swing.JFrame; public class Game { public

我正在构建一个游戏,游戏的目标是让一名骑士环游世界,并能够与其他骑士作战

我有一个主要的班级,开始游戏:

public class Main {

    public static void main(String[] args) {    
    new Game();
    }
}
创建JFrame的类游戏:

import java.awt.GridLayout;

import javax.swing.JFrame;

public class Game {

    public Game() {
        JFrame frame = new JFrame();
        frame.setTitle("Knights Tournament");
        frame.add(new Board());
        frame.setSize(700, 700);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
还有一个类板(你猜对了!)创建了游戏板:

public class Board extends JPanel {

    Tile[][] grid = new Tile[15][15];

    public Board(){

        // Create the grid
        CreateGrid();

        // Add the player
        grid[0][0] = new Player(0, 0);
    }

    // Method that creates a grid of tiles
    private void CreateGrid() {
        setLayout(new GridLayout (15, 15));
        for(int i = 0; i < 15; i++){
            for(int j = 0; j < 15; j++){
                grid[i][j] = new Tile(i, j);
                add(grid[i][j]);
            }
        }
   }
}
我面临的问题如下:我想用另一个扩展平铺的类播放器替换网格[0][0]。tile和player之间的区别在于Jbutton会收到一条文本,上面写着“P”,我试过这样做:

public class Player extends Tile{

    public Player(int x, int y) {
        super(x, y);
        this.setText("P");
   }

}

在类板的构造函数中,我尝试将网格[0][0]从平铺更改为播放器,这样它将显示p,但由于某种原因,它没有这样做(它确实将网格[0][0]的类型更改为播放器…),我希望有人能帮上忙。

您不应该尝试用UI维护对象的状态。相反,UI应该可视化游戏(或模型)的底层逻辑的状态。这允许您修改模型、更改规则、添加/删除元素(例如,考虑添加新怪物或战利品),而无需实际修改UI或其可视化此状态的方式(在很大程度上)

其思想是,
Player
属性应该使用它自己的类来维护,该类由模型管理。然后,用户界面将用于可视化模型的状态

单击
磁贴时
将通知“控制器”。控制器将从游戏“模型”请求有状态信息,“控制器”将根据此信息更改按钮的状态,以满足“模型”的要求

这只需要“控制器”更新按钮信息(文本/图标),而无需更改物理按钮

这将责任划分为定义的层,并减少代码的耦合,因此一个或多个层可以更改,但总体结构不会崩溃,也不需要大量修改以处理这些更改

该模型负责维护游戏的虚拟状态,管理单个游戏对象(战斗等)之间的交互

UI负责为用户提供模型的可视化,控制器用于管理take之间的交互,获取用户输入并将其传递给模型,监控模型状态的变化,并告知UI何时需要更新


模型-视图-控制器范例是跨不同语言GUI开发中常用的方法。查看更多详细信息。

为什么不更新现有的
标题
状态,而不是将其替换到棋盘上?玩家类将获得额外的变量,如“攻击”、“防御”等。。。我还将增加我能够与之战斗的敌人。要检查互动程序是否包含敌人,我想使用instanceof函数…因此互动程序应该由玩家替换,如果你知道我的意思,这些信息应该是模型层的一部分,而不是UI,UI代表模型的状态,模型管理事物的工作方式,控制器管理这两者之间的交互…你是指磁贴还是标题?@Jpa,这都是测试的一部分;)认真地有人想告诉我投票失败的原因吗?你没有真正回答他的问题,只是看起来你建议了另一种模式。@JPA是的,我建议了另一种模式,以帮助OP避免他们“认为”他们需要的方法的常见陷阱。我建议了一条新的道路,让他们不仅能以更好的方式实现他们想做的事情,而且从长远来看,也能让他们更容易实现和维护,以及在他们正在工作的框架内向他们介绍适当的方法。我没有简单地指出扳机在哪里(这样他们就可以把脚打掉),而是介绍了枪支安全。。。
public class Player extends Tile{

    public Player(int x, int y) {
        super(x, y);
        this.setText("P");
   }

}