Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从视图访问应用程序的数据或模型?_Java_Swing_Model View Controller - Fatal编程技术网

Java 如何从视图访问应用程序的数据或模型?

Java 如何从视图访问应用程序的数据或模型?,java,swing,model-view-controller,Java,Swing,Model View Controller,我对编写大型图形应用程序比较陌生,作为一个项目,我必须用Java编写一个使用swing的游戏,同时使用适当的软件工程原理。我已经将图形界面与游戏逻辑解耦,但现在我不知道如何访问视图中需要填充的所有数据 例如,我有一个名为“Board”的类,它引用了一系列“Territory”对象,而这些对象又引用了地图相关区域的多边形对象。我想制作一个显示图形世界地图的自定义JPanel,并从board对象获取领土集合,以便使用多边形对象使地图具有交互性 我考虑过使用某种形式的单例或工厂设计模式,以便根据需要访

我对编写大型图形应用程序比较陌生,作为一个项目,我必须用Java编写一个使用swing的游戏,同时使用适当的软件工程原理。我已经将图形界面与游戏逻辑解耦,但现在我不知道如何访问视图中需要填充的所有数据

例如,我有一个名为“Board”的类,它引用了一系列“Territory”对象,而这些对象又引用了地图相关区域的多边形对象。我想制作一个显示图形世界地图的自定义JPanel,并从board对象获取领土集合,以便使用多边形对象使地图具有交互性

我考虑过使用某种形式的单例或工厂设计模式,以便根据需要访问所有数据,但似乎单例不是我想要的,我甚至不太了解工厂模式,无法确定它是否是我想要的。我是要被迫将所有对象的引用传递给GUI的每个组件,还是有更好的方法


这里是我的一些代码,虽然我不知道在这个阶段它会有多大帮助

public class MapPanel extends JPanel {

    private Image image;
    private List<Territory> territories;

    public MapPanel() {
        try {
            BufferedInputStream in = new BufferedInputStream(
                    ClassLoader.getSystemResourceAsStream("MapBig.jpg"));
            image = ImageIO.read(in);
        } catch (IOException ex) {
            // handle exception...
        }

        initialize();
    }

    private void initialize() {
        this.setPreferredSize(new Dimension(900, 600));
    }

    public void setBackground(Image i) {
        this.image = i;
        repaint();
    }

    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}
公共类映射面板扩展了JPanel{
私有图像;
私有领土名单;
公共地图面板(){
试一试{
BufferedInputStream in=新的BufferedInputStream(
ClassLoader.getSystemResourceAsStream(“mappig.jpg”);
image=ImageIO.read(in);
}捕获(IOEX异常){
//处理异常。。。
}
初始化();
}
私有void初始化(){
此.setPreferredSize(新尺寸(900600));
}
公共空间背景(图一){
this.image=i;
重新油漆();
}
公共组件(最终图形g){
超级组件(g);
g、 drawImage(image,0,0,null);
}
}
和我的董事会班级:

public class Board {

  private List<Territory> territories;
  //private List<List<Tile>> rows;

  public Board(List<Territory> territories) {
    this.territories = territories;
  }

  public Iterator<Territory> getTerritories() {
    return territories.iterator();
  }
}
公共课程委员会{
私有领土名单;
//私有列表行;
公共事务委员会(地区名单){
这个地区=地区;
}
公共迭代器getTerritories(){
return.iterator();
}
}
还有我的Territory类,它保存了我想要使用的多边形

public class Territory implements java.io.Serializable {

  //region Private Variables
  /**
   * 
   */
  private static final long serialVersionUID = 5360937073507663827L;

  /**
   * The territory's name. 
   */
  private String name;

  /**
   * The representation of this territory in 2d space. 
   */
  private Polygon region;

  /**
   * List of Player objects currently residing in this geographical area
   * of the world map.
   */
  private List<Player> players;

  /**
   * Country that owns this territory.
   */
  private Country owner;

  /**
   * List of neighboring territories that can be traveled to.
   */
  private List<Territory> neighbors;
  //endregion Private Variables

  public Territory(String name, Polygon region) {
    this.name = name;
    this.region = region;
    players = new ArrayList<Player>();
    owner = null;
  }

  /**
   * Get the name of this territory.
   * @return    name of this territory
   */
  public String getName() { return name; }
  /**
   * Set the name of this territory.
   * @param name    name to give this territory
   */
  public void setName(String name) { this.name=name; }
  /**
   * Get the bounded region for this territory.
   * @return    a Polygon object representing the 2D bounds of this
   * territory
   */
  public Polygon getRegion() { return region; }
  /**
   * Set the bounded region for this territory.
   * @param region  a Polygon object representing the 2D bounds of this
   * territory
   */
  public void setRegion(Polygon region) { this.region=region; }
  /**
   * Get the owning Country.
   * @return    the Country object that owns the geograpical area bounded
   * by this territory.
   */
  public Country getCountry() { return owner; }
  /**
   * Set the owning Country.
   * @param country the Country object that owns the geograpical area 
   * bounded by this territory.
   */
  public void setCountry (Country country) { this.owner=country; }
  public Iterator<Territory> getNeighbors() { return neighbors.iterator(); }
  public void setNeighbors(List<Territory> neighbors) { this.neighbors = neighbors; }

  /**
   * Get a list of all Player objects currently residing in this geographical 
   * area of the world map.
   * @return    an Iterator over a List of Player objects
   */
  public Iterator<Player> getPlayers() { return players.iterator(); }
  /**
   * Adds a player to this Territory
   * @param player  Player object to add to this Territory
   */
  public void addPlayer(Player player) { players.add(player); }
  /**
   * 
   * @param player
   */
  public void removePlayer(Player player) { players.remove(player); }
}
公共类区域实现java.io.Serializable{
//区域私有变量
/**
* 
*/
私有静态最终长serialVersionUID=5360937073507663827L;
/**
*领土的名称。
*/
私有字符串名称;
/**
*该区域在二维空间中的表示。
*/
私有多边形区域;
/**
*当前居住在此地理区域的玩家对象列表
*世界地图的一部分。
*/
私人名单玩家;
/**
*拥有该领土的国家。
*/
私人国家所有者;
/**
*可前往的邻近地区列表。
*/
私人名单邻居;
//端域私有变量
公共区域(字符串名称、多边形区域){
this.name=名称;
这个区域=区域;
players=newarraylist();
所有者=空;
}
/**
*获取此区域的名称。
*@返回此区域的名称
*/
公共字符串getName(){return name;}
/**
*设置此区域的名称。
*@param name指定此区域的名称
*/
public void setName(字符串名){this.name=name;}
/**
*获取此区域的有界区域。
*@返回一个多边形对象,该对象表示此对象的二维边界
*领地
*/
公共多边形getRegion(){return region;}
/**
*设置此区域的边界区域。
*@param region表示此区域二维边界的多边形对象
*领地
*/
公共无效集合区域(多边形区域){this.region=region;}
/**
*获得所属国家。
*@返回拥有地理区域的国家/地区对象
*在这片土地上。
*/
公共国家/地区getCountry(){return owner;}
/**
*设置所属国家。
*@param country拥有地理区域的国家/地区对象
*以该领土为边界。
*/
public void setCountry(Country Country){this.owner=Country;}
公共迭代器getNeights(){返回邻居。迭代器();}
public void setneights(列出邻居){this.neights=neights;}
/**
*获取当前驻留在此地理位置的所有玩家对象的列表
*世界地图的面积。
*@返回玩家对象列表上的迭代器
*/
公共迭代器getPlayers(){return players.Iterator();}
/**
*将玩家添加到此区域
*@param player要添加到此区域的对象
*/
公共无效添加玩家(玩家){players.add(玩家);}
/**
* 
*@param播放器
*/
公共无效移除玩家(玩家){玩家。移除(玩家);}
}

您需要使用可观察模式在MVC模式的组件之间进行通信。 此外,您可能需要考虑使用外观模式来确保通信被简化。 模型:所有游戏逻辑(也包含对象列表!) 控制器:解释GUI上的用户输入 查看:报告gui上的操作


查看此链接:

您能发布一些代码吗?您能在JPanel中创建一个模型类的实例吗?这就是我在参加MVC国际象棋项目时被告知要做的事情Java@imulsion更新了一些代码我应该更喜欢一个模型类/接口和一个控制器吗?如果是这样的话,这似乎会使事情变得过于复杂。比如说,我有一个游戏,有独立的运动部件:每个玩家都有自己的统计数据,还有一个游戏板,让玩家四处移动。如果我有一个包含棋盘的面板,一个包含玩家统计信息的面板,以及一个显示世界状态不同视图的面板,是否应该有一个访问点来更新all