Mason 入门例子4 --- 增加UI

MASON严格遵循MVC设计模式:

Model和View之间是严格分离开的。


1. 创建一个空的窗口

package com.mason.learn;

import sim.engine.*;
import sim.display.*;

public class StudentsWithUI extends GUIState {
	public static void main(String[] args) {
		StudentsWithUI vid = new StudentsWithUI();
		Console c = new Console(vid);
		c.setVisible(true);
	}

	public StudentsWithUI() {
		super(new Students(System.currentTimeMillis()));
	}

	public StudentsWithUI(SimState state) {
		super(state);
	}

	public static String getName() {
		return "Student Schoolyard Cliques";
	}
}


2. 添加可视化组件

sim.display.Display2D:用于显示field,也就是我们的yard操场
javax.swing.JFrame:承载Display

sim.portrayal.continuous.ContinuousPortrayal2D:对field进行绘制或者监控。

sim.portrayal.simple.OvalPortrayal2D:在field portrayal中注册的simple portrayal,用于绘制图形。



在上述空窗口的基础上,我们增加了三个域和一些重要的方法:

public Display2D display;
public JFrame displayFrame;
ContinuousPortrayal2D yardPortrayal = new ContinuousPortrayal2D();


init():创建一个600px*600px的Display,并且设置其不按照100*100的尺寸剪裁,然后创建承载它的frame,并命名,然后再Console(是Controller的子类)中注册这个frame,然后把field portrayal和这个Display(名字为Yard)联系起来。

public void init(Controller c) {
		super.init(c);
		display = new Display2D(600, 600, this);
		display.setClipping(false);
		displayFrame = display.createFrame();
		displayFrame.setTitle("Schoolyard Display");
		c.registerFrame(displayFrame); // so the frame appears in the "Display"
										// list
		displayFrame.setVisible(true);
		display.attach(yardPortrayal, "Yard");
	}


start()和load():基本上相同,当正要开始进行仿真或者重新恢复仿真状态的时候调用。

GUIState这个类中有两个重要的实例:

state:保存仿真的模型Model,本例中应该是Students实例。

controller:GUI系统的控制器,通常在init之后进行设置。


setupPortrayals功能: 

1. 设置field的simple portrayals和field portrayal

2. 重置和清理Display

	public void start() {
		super.start();
		setupPortrayals();
	}

	public void load(SimState state) {
		super.load(state);
		setupPortrayals();
	}

	public void setupPortrayals() {
		Students students = (Students) state;
		// tell the portrayals what to portray and how to portray them
		yardPortrayal.setField(students.yard);
		yardPortrayal.setPortrayalForAll(new OvalPortrayal2D());
		// reschedule the displayer
		display.reset();
		display.setBackdrop(Color.white);
		// redraw the display
		display.repaint();
	}


quit(): 当退出界面时调用,用于清理GUI。

	public void quit() {
		super.quit();
		if (displayFrame != null)
			displayFrame.dispose();
		displayFrame = null;
		display = null;
	}


添加完上述几个方法后,窗口显示为:因为节点之间的引力过大,才会呈现为一团。。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anyanyamy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值