📄 stockpane.java
字号:
package com.zcsoft.stock;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import com.zcsoft.graphics.line.*;
import com.zcsoft.image.*;
import com.zcsoft.xml.*;
/**
* 立体仓库仓库绘制组件
* 立体仓库一般包含一个或多个输送子系统和一个堆垛机子系统(或称货架子系统)。
* 用于可在该组件上拖动各子系统的相对位置和大小。
*/
public class StockPane extends ShapePane
{
Image backgroundImage;
/** 是否处于调试模式 */
private boolean debug;
public StockPane()
{
}
/**
* 用XML文件配置构建仓库绘制面板
* @param root 由XML文件的XML根节点对象。节点标记名为:stock
* @param stackerMakers 存储堆垛机绘制器的容器
* @param subSystemMakers 存储开关子系统的容器
* @return
*/
public Device[] configureFromElement(Element root
, java.util.List stackerMakers
, java.util.List subSystemMakers)
{
this.setPreferredSize(this.sizeValue(root.getAttributeValue("prefSize")));
URL imageURL = getImageURL(root.getAttributeValue("image"));
if (imageURL != null)
{
this.setBackgroundImage(ImageMaker.getCachedImage(imageURL));
}
this.setDebug("true".equals(root.getAttributeValue("debug")));
Iterator children = root.getChildren();
Point origin = new Point();
ArrayList devices = new ArrayList();
DeviceMaker dm;
while (children.hasNext())
{
Element child = (Element)children.next();
String deviceType = child.getTagName();
if (deviceType.equals("switchSystem"))
{
subSystemMakers.add(createSwitchSytem(devices, child, origin));
continue;
}
else if (deviceType.equals("stacker"))
{
dm = this.createStacker(child, origin);
if (stackerMakers != null)
{
stackerMakers.add(dm);
}
}
else if (deviceType.equals("chain"))
{
dm = this.createChain(child, origin);
}
else if (deviceType.equals("elevator"))
{
dm = this.createElevator(child, origin);
}
else if (deviceType.equals("allocator"))
{
dm = this.createAllocator(child, origin);
}
else
{
dm = null;
}
if (dm != null)
{
this.addShapeMaker(dm);
devices.add(dm.getDevice());
}
}
return (Device[])devices.toArray(new Device[devices.size()]);
}
/**
* 由XML中的元素定义构建开关系统绘制器对象
* @param cachedDevices 用于存储各个开关的数据对象的容器
* @param e
* @param origin
* @return
*/
SubSystemMaker createSwitchSytem(java.util.List cachedDevices, Element e, Point origin)
{
SubSystemMaker sm = new SubSystemMaker(getImageURL(e.getAttributeValue("image")));
sm.setLocation(pointValue(e.getAttributeValue("origin"), origin));
sm.setNormalLocation(pointValue(e.getAttributeValue("normalLocation"), origin));
sm.setMinimumSize(sizeValue(e.getAttributeValue("minimumSize")));
sm.setSize(sm.getMinimumSize());
sm.setName(e.getAttributeValue("name"));
Iterator switches = e.getChildren("switch");
DeviceMaker dm;
while (switches.hasNext())
{
dm = createSwitch(sm, (Element)switches.next(), origin);
sm.addDeviceMakers(dm);
cachedDevices.add(dm.getDevice());
}
return sm;
}
/**
* 由XML中的元素定义开关绘制器对象
*
* @param pls 开关数据对象属性变化侦听实现
* @param e <switch>元素
* @param origin 存储原点坐标的容器(避免构建对象的资源开销)
* @return 开关绘制器
*/
SwitchMaker createSwitch(java.beans.PropertyChangeListener pls, Element e, Point origin)
{
SwitchMaker sm = new SwitchMaker();
sm.setDevice(new Switch(e.getAttributeValue("id")), pls);
sm.setLocation(pointValue(e.getAttributeValue("origin"), origin));
sm.setOnImageURL(getImageURL(e.getAttributeValue("onImage")));
sm.setOffImageURL(getImageURL(e.getAttributeValue("offImage")));
return sm;
}
/**
* 由XML中的元素定义输送机绘制器对象
* @param e
* @param origin
* @return
*/
ChainMaker createChain(Element e, Point origin)
{
ChainMaker sm = new ChainMaker();
sm.setDevice(new Chain(e.getAttributeValue("id")));
sm.setLocation(pointValue(e.getAttributeValue("origin"), origin));
sm.setImageURL(getImageURL(e.getAttributeValue("image")));
sm.setSize(sizeValue(e.getAttributeValue("size")));
sm.setForwardIcon(createDirectionPainter(e.getChild("forwardIcon"), origin));
sm.setBackwardIcon(createDirectionPainter(e.getChild("backwardIcon"), origin));
sm.setAheadTrayMaker(createContainerMaker(e.getChild("aheadTrayIcon"), origin));
sm.setBackTrayMaker(createContainerMaker(e.getChild("backTrayIcon"), origin));
return sm;
}
/**
* 由XML中的元素定义升降台绘制器对象
* @param e
* @param origin
* @return
*/
ElevatorMaker createElevator(Element e, Point origin)
{
ElevatorMaker sm = new ElevatorMaker();
sm.setDevice(new Elevator(e.getAttributeValue("id")));
sm.setImageURL(getImageURL(e.getAttributeValue("image")));
sm.setLocation(pointValue(e.getAttributeValue("origin"), origin));
sm.setSize(sizeValue(e.getAttributeValue("size")));
sm.setForwardIcon(createDirectionPainter(e.getChild("forwardIcon"), origin));
sm.setBackwardIcon(createDirectionPainter(e.getChild("backwardIcon"), origin));
sm.setUpwardIcon(createDirectionPainter(e.getChild("upwardIcon"), origin));
sm.setDownwardIcon(createDirectionPainter(e.getChild("downwardIcon"), origin));
sm.setTrayMaker(createContainerMaker(e.getChild("downViewContainer"), origin));
return sm;
}
/**
* 由XML中的元素定义堆垛机绘制器对象
* @param e
* @param origin
* @return
*/
StackerMaker createStacker(Element e, Point origin)
{
StackerMaker sm = new StackerMaker();
sm.setDevice(new Stacker(e.getAttributeValue("id")));
sm.setDownViewImageURL(getImageURL(e.getAttributeValue("downViewImage")));
sm.setFaceViewImageURL(getImageURL(e.getAttributeValue("faceViewImage")));
sm.setLiftImageURL(getImageURL(e.getAttributeValue("liftImage")));
Integer lineNo = IntegerValue(e.getAttributeValue("reversePaintLine"));
if (lineNo != null)
{
sm.setReversePaintLine(lineNo.intValue());
}
sm.setDownViewContainer(createContainerMaker(e.getChild("downViewContainer"), origin));
sm.setFaceViewContainer(createContainerMaker(e.getChild("faceViewContainer"), origin));
sm.setForwardIcon(createDirectionPainter(e.getChild("forwardIcon"), origin));
sm.setBackwardIcon(createDirectionPainter(e.getChild("backwardIcon"), origin));
sm.setUpwardIcon(createDirectionPainter(e.getChild("upwardIcon"), origin));
sm.setDownwardIcon(createDirectionPainter(e.getChild("downwardIcon"), origin));
sm.setHorizonalPath(createPath(e.getChild("horizonalPath")));
sm.setVerticalPath(createPath(e.getChild("verticalPath")));
return sm;
}
/**
* 由XML中的元素定义堆垛机绘制器对象
* @param e
* @param origin
* @return
*/
AllocatorMaker createAllocator(Element e, Point origin)
{
AllocatorMaker sm = new AllocatorMaker();
sm.setDevice(new Stacker(e.getAttributeValue("id")));
sm.setImageURL(getImageURL(e.getAttributeValue("image")));
sm.setContainer(createContainerMaker(e.getChild("downViewContainer"), origin));
sm.setHorizonalPath(createPath(e.getChild("horizonalPath")));
return sm;
}
/**
* 由XML中的元素定义运行方向绘制器对象
* @param e
* @param location
* @return
*/
DirectionPainter createDirectionPainter(Element e, Point location)
{
if (e == null)
{
return null;
}
DirectionPainter dp = new DirectionPainter();
dp.setLocation(pointValue(e.getAttributeValue("location"), location));
String av = e.getAttributeValue("color");
if (av != null)
{
dp.setColor(Color.decode(av));
}
av = e.getAttributeValue("image");
if (av != null)
{
dp.setImage(getCachedImage(av));
}
av = e.getAttributeValue("size");
if (av != null)
{
dp.setSize(sizeValue(av));
}
av = e.getAttributeValue("direction");
if (av != null)
{
dp.setDirection(av);
}
return dp;
}
/**
*
* @param e
* @param origin
* @return
*/
ImageMaker createContainerMaker(Element e, Point origin)
{
if (e == null)
{
return null;
}
ImageMaker im = new ImageMaker(getImageURL(e.getAttributeValue("image")));
im.setLocation(pointValue(e.getAttributeValue("location"), origin));
return im;
}
/**
*
* @param e
* @return
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -