【问题标题】:JButton child does not update textJButton子不更新文本
【发布时间】:2018-07-29 04:55:49
【问题描述】:

我正在构建一个游戏,目标是让骑士在世界各地移动,并能够与其他骑士战斗。

我有一个启动游戏的 Main 类:

public class Main {

    public static void main(String[] args) {    
    new Game();
    }
}

创建 JFrame 的类 Game:

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);
    }
}

还有一个类 Board(你猜对了!)创建了 GameBoard:

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]);
            }
        }
   }
}

网格最初由 15x15 个图块组成。

 public class Tile extends JButton implements ActionListener {

    public int xCo;
    public int yCo;

    public Tile(int x, int y) {
        setXCo(x);
        setYCo(y);
    }

    public void setXCo(int x) {
        this.xCo = x;
    }

    public void setYCo(int y) {
        this.yCo = y;
    }

    public int getXCo() {
        return xCo;
    }

    public int getYCo() {
        return yCo;
    }
}

我面临的问题如下:我想用另一个扩展图块的类 Player 替换 grid[0][0]。 tile 和 player 之间的区别在于 Jbutton 会收到一条说“P”的文本,我试过这个:

public class Player extends Tile{

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

}

在类板的构造函数中,我尝试将 grid[0][0] 从 tile 更改为 player,以便它显示 P,但由于某种原因它没有这样做(它确实改变了 grid[0] 的类型][0] 给玩家...)希望有人能提供帮助。

【问题讨论】:

  • 为什么不直接更新现有的Title 状态而不是在板上替换它?
  • 玩家类将获得额外的变量,如“攻击”、“防御”等……我还将添加我能够与之战斗的敌人。要检查图块是否包含敌人,我想使用 instanceof 函数...
  • 所以如果你明白我的意思的话,瓷砖应该被玩家替换
  • 这个信息应该是模型层的一部分,而不是 UI,UI 代表模型的状态,模型管理事物的工作方式,控制器管理两者之间的交互...

标签: java swing user-interface jbutton


【解决方案1】:

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

这个想法是,Player 属性应该使用它自己的类来维护,该类由模型管理。然后将使用 UI 来可视化模型的状态。

点击Tile 时会通知“控制器”。控制器会向游戏“模型”请求状态信息,“控制器”会根据这些信息改变按钮的状态以满足“模型”的要求

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

这将职责分离到定义的层并减少代码的耦合,因此一个或多个层可以更改,但整体结构不会分解或需要大量修改以处理这些更改。

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

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

模型-视图-控制器范式是跨不同语言的 GUI 开发中常用的方法。更多详情请查看Model–view–controller

【讨论】:

  • 你是指Tile还是Title?
  • @Jpa 这是测试的全部部分;)
  • 认真的吗?有人愿意告诉我投反对票的原因吗?
  • 你没有真正回答他的问题,只是看起来你建议使用另一种模式。
  • @JPA 是的,我提出了另一种模式,以帮助 OP 避免他们“认为”他们需要的方法的常见陷阱。我没有将 OP 发送到会导致更多问题的路径,而是建议了一条新路径,该路径不仅可以让他们以更好的方式实现他们想要做的事情,而且还可以更简单地实现和维护从长远来看,并向他们介绍他们正在工作的框架内的适当方法。我没有试图简单地指出扳机在哪里(这样他们就可以把脚开枪了),而是介绍了枪支安全......
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多