void showMovieFrame(int frame) {
		if (frame < 0 || movie.length() <= 0)
			return;
		if (frame >= movie.length())
			throw new IllegalArgumentException("Frame " + frame + " does not exist");
		view.showFrameOfImages(frame);
		modelTime = modelTimeQueue.getData(frame);
		for (int i = 0; i < numberOfAtoms; i++) {
			Atom a = atom[i];
			a.rx = a.rQ.getQueue1().getData(frame);
			a.ry = a.rQ.getQueue2().getData(frame);
			a.vx = a.vQ.getQueue1().getData(frame);
			a.vy = a.vQ.getQueue2().getData(frame);
			a.ax = a.aQ.getQueue1().getData(frame);
			a.ay = a.aQ.getQueue2().getData(frame);
			a.fx = a.ax * a.mass;
			a.fy = a.ay * a.mass;
		}
		if (obstacles != null && !obstacles.isEmpty()) {
			RectangularObstacle obs = null;
			synchronized (obstacles.getSynchronizationLock()) {
				for (Iterator it = obstacles.iterator(); it.hasNext();) {
					obs = (RectangularObstacle) it.next();
					if (obs.isMovable()) {
						if (obs.rxryQ != null && !obs.rxryQ.isEmpty()) {
							obs.setRect(obs.rxryQ.getQueue1().getData(frame), obs.rxryQ.getQueue2().getData(frame), obs.getWidth(), obs.getHeight());
						}
						if (obs.vxvyQ != null && !obs.vxvyQ.isEmpty()) {
							obs.vx = obs.vxvyQ.getQueue1().getData(frame);
							obs.vy = obs.vxvyQ.getQueue2().getData(frame);
						}
					}
				}
			}
		}
		if (subatomicEnabled) {
			for (int i = 0; i < numberOfAtoms; i++) {
				if (atom[i].getElectrons().isEmpty())
					continue;
				atom[i].getElectron(0).setEnergyLevel(getElement(atom[i].id).getElectronicStructure().getEnergyLevel(atom[i].excitationQ.getData(frame)));
			}
			notifyUpdateListeners(new UpdateEvent(AtomicModel.this, UpdateEvent.VIEW_UPDATED));
		}
		if (subatomicEnabled || (lightSource != null && lightSource.isOn())) {
			if (photonQueue != null) {
				if (photons != null)
					photons.clear();
				Object o = photonQueue.getData(frame);
				if (o instanceof ArrayList) {
					List<Photon.Delegate> list = (ArrayList<Photon.Delegate>) o;
					for (Photon.Delegate pd : list) {
						Photon p = new Photon(pd.getX(), pd.getY(), pd.getOmega());
						p.setModel(AtomicModel.this);
						p.setAngle(pd.getAngle());
						photons.add(p);
					}
				}
			}
		}
		if (view.getUseJmol())
			view.refreshJmol();
	}