java - JButton 子级不更新文本

标签 java swing user-interface jbutton

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

我有一个启动游戏的 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 block 组成。

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

我面临的问题如下:我想用另一个扩展图 block 的类 Player 替换 grid[0][0] 。磁贴和播放器之间的区别在于 Jbutton 会收到一条显示“P”的文本,我已经尝试过:

public class Player extends Tile{

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

}

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

最佳答案

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

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

单击时,Tile 将通知“ Controller ”。 Controller 将从游戏“模型”请求状态信息,并根据此信息,“ Controller ”将更改按钮的状态以满足“模型”的要求

这仅需要“ Controller ”更新按钮信息(文本/图标),而不需要更改物理按钮。

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

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

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

模型- View - Controller 范例是跨语言的 GUI 开发中常用的方法。看看Model–view–controller了解更多详情。

关于java - JButton 子级不更新文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515747/

相关文章:

python - Qgridlayout 控制widget的大小

java - 在 openssl 的 native 代码中使用来自 java 的私钥

java - Storm apache升级(1.0.0到2.0.0)

java - 为什么我不能setText这个jTextField?

java - 从 JList 中获取多个选定项

java - 使用 CSS 为 Javafx 设计样式

java - 如何在同一位置用另一个 JPanel 替换一个 JPanel?

Java:序列化单例的实际用例?

Java - 无法在 BufferedReader 中正确读取特殊字符

Java requestInWindow 有时不起作用