JButton子项不更新文本

时间:2014-12-16 23:19:37

标签: 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 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);
    }
}

一个班级董事会(你猜对了!)创建了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;
    }
}

我面临的问题如下:我想用另一个扩展磁贴的类播放器替换grid [0] [0]。瓷砖和播放器之间的区别在于Jbutton会收到一条文字说“P&#39;我试过这个:

public class Player extends Tile{

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

}

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

1 个答案:

答案 0 :(得分:2)

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

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

点击后Tile会通知“控制器”。控制器将从游戏“模型”中请求有状态信息,并且基于该信息,“控制器”将改变按钮的状态以满足“模型”的要求

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

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

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

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

模型 - 视图 - 控制器范例是跨不同语言的GUI开发中使用的常用方法。有关详细信息,请查看Model–view–controller