Java 如何从视图访问应用程序的数据或模型?
我对编写大型图形应用程序比较陌生,作为一个项目,我必须用Java编写一个使用swing的游戏,同时使用适当的软件工程原理。我已经将图形界面与游戏逻辑解耦,但现在我不知道如何访问视图中需要填充的所有数据 例如,我有一个名为“Board”的类,它引用了一系列“Territory”对象,而这些对象又引用了地图相关区域的多边形对象。我想制作一个显示图形世界地图的自定义JPanel,并从board对象获取领土集合,以便使用多边形对象使地图具有交互性 我考虑过使用某种形式的单例或工厂设计模式,以便根据需要访问所有数据,但似乎单例不是我想要的,我甚至不太了解工厂模式,无法确定它是否是我想要的。我是要被迫将所有对象的引用传递给GUI的每个组件,还是有更好的方法Java 如何从视图访问应用程序的数据或模型?,java,swing,model-view-controller,Java,Swing,Model View Controller,我对编写大型图形应用程序比较陌生,作为一个项目,我必须用Java编写一个使用swing的游戏,同时使用适当的软件工程原理。我已经将图形界面与游戏逻辑解耦,但现在我不知道如何访问视图中需要填充的所有数据 例如,我有一个名为“Board”的类,它引用了一系列“Territory”对象,而这些对象又引用了地图相关区域的多边形对象。我想制作一个显示图形世界地图的自定义JPanel,并从board对象获取领土集合,以便使用多边形对象使地图具有交互性 我考虑过使用某种形式的单例或工厂设计模式,以便根据需要访
这里是我的一些代码,虽然我不知道在这个阶段它会有多大帮助
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