我真的不明白如何划分模型和视图的类。
假设我有一个类Cat,它有一些参数,如颜色,年龄,地图上的位置和其他一些东西。我认为创建自定义绘画的最佳方法是覆盖paintComponent
方法。但是,Cat类应该在模型中,并且它不应该知道它在视图中呈现的方式。
那么如何画猫?假设它由一组图像表示,并且模型具有可变方向,其可以包含从0到3的int,其与阵列中的图片相关。画一只猫应该怎么做?它应该只在某个地方:
drawImage(model.getCat().getArray( model.getCat().getFrame() )) ?
答案 0 :(得分:2)
假设Cat类由图像数组表示,模型具有可变方向,可以包含0到3的int,它与数组中的图片有关。
在表示扩展JPanel的绘图面板的类中,保留一个Image。
您必须将一个或多个Cat实例传递给构造函数中的绘图面板类。
在绘图面板类中,您将拥有一个包含以下行的setImage方法:
this.image = cat.getImage(imageNumber);
在覆盖的paintComponent方法中,您将拥有以下行
drawImage(image, 0, 0, this);
查看我的文章2048 Game in Java Swing,了解如何在游戏中创建和使用模型,视图和控制器。
答案 1 :(得分:0)
假设Cat
是模型。用Cat.setPosition(int position)
之类的东西改变猫的位置。调用它需要触发视图可以侦听的事件。设置它的一种简单方法是让Cat
扩展java.util.Observable
并从setChanged()
内调用notifyObservers()
和setPosition()
。
现在供您查看。它可以访问要更新/绘制的UI组件,并使用java.util.Observer
界面来监听Cat
个事件。将Cat
传递给视图的构造函数并添加一个观察者。您必须确定视图是否扩展Observer
,还是使用其他内部或匿名类。现在,当猫移动时,视图将获得事件并调用getPosition()
,它将用于从图像阵列中选择正确的图像。任何图像或绘图说明都将在视图中,但基于Cat
模型的属性。
那么控制器是什么?这是处理用户事件的任何事情,例如按钮上的ActionListener
。也许您希望用户单击视图中猫的图像以使猫移动到新位置。图像组件单击处理程序是控制器,将调用Cat.setPosition()
。这将导致Cat
模型触发一个事件,视图将观察该事件,然后在新位置重绘猫。
只要所有内容都由Swing / AWT组件事件驱动,您就不必担心线程安全。否则请参阅passing objects to another thread了解一些想法。