📄 curveshow.java
字号:
package asm;import java.awt.event.*;import java.util.Vector;import java.awt.*;/** * Title: Artificial Stock Market * Description: 人工模拟股市(来源:SFI的Swarm版本)的Java版本 * Copyright: Copyright (c) 2003 * Company: http://agents.yeah.net * @author jake * @version 1.0 */public class CurveShow extends Frame implements Runnable{ Panel view = new Panel(); Thread runner1;//定义独立线程 Graphics gra;//在一个面板view上画图 int cycles=100;//图中显示的横坐标数目 int cyclemax;//主程序中定义的历史数据最大长度 int originx=40;//画图区域原点的坐标 int originy=20; int type; public int nAgentIndex=0; AsmModel local;//主程序的本地拷贝 Choice choicelen = new Choice(); Label label1 = new Label(); Label label2 = new Label(); Choice choiceItem1 = new Choice(); Label label3 = new Label(); Choice choiceItem2 = new Choice(); Label lblAgent = new Label(); Choice choiceAgent = new Choice(); Label label5 = new Label(); Label label6 = new Label(); public CurveShow(AsmModel pd,int type1) { super("数据走向..."); local=pd; type=type1; try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(null); view.setBackground(Color.white); view.setBounds(new Rectangle(6, 26, 537, 316)); this.setBackground(Color.gray); this.addWindowListener(new java.awt.event.WindowAdapter() { public void windowOpened(WindowEvent e) { this_windowOpened(e); } public void windowClosing(WindowEvent e) { this_windowClosing(e); } }); choicelen.setBounds(new Rectangle(69, 355, 94, 21)); choicelen.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(ItemEvent e) { choicelen_itemStateChanged(e); } }); for(int i=0;i<40;i++){ choicelen.addItem(Integer.toString((i+1)*100)); } if(type==0){ choiceItem1.addItem("股票价格"); choiceItem2.addItem("股票价格"); choiceItem1.addItem("股息"); choiceItem2.addItem("股息"); choiceItem1.addItem("风险中性价格"); choiceItem2.addItem("风险中性价格"); choiceItem2.addItem("无"); choiceItem1.select(0); choiceItem2.select(2); }else if(type==1){ for(int i=0;i<local.asmModelParams.numBFagents;i++){ choiceAgent.addItem(Integer.toString(i)); } choiceItem1.addItem("股票需求量"); choiceItem1.addItem("总财富"); choiceItem1.addItem("股票份额"); choiceItem1.addItem("现金量"); choiceItem1.addItem("规则平均特定度"); choiceItem1.addItem("预测量"); choiceItem1.addItem("预测偏差"); choiceItem1.addItem("预测系数a"); choiceItem1.addItem("预测系数b"); choiceItem2.addItem("股票需求量"); choiceItem2.addItem("总财富"); choiceItem2.addItem("股票份额"); choiceItem2.addItem("现金量"); choiceItem2.addItem("规则平均特定度"); choiceItem2.addItem("预测量"); choiceItem2.addItem("预测偏差"); choiceItem2.addItem("预测系数a"); choiceItem2.addItem("预测系数b"); choiceItem2.addItem("无"); choiceItem1.select(0); choiceItem2.select(choiceItem2.getItemCount()-1); } label1.setText("显示长度:"); label1.setBounds(new Rectangle(4, 360, 60, 12)); label2.setText("观察项目1:"); label2.setBounds(new Rectangle(171, 342, 70, 21)); choiceItem1.setBounds(new Rectangle(239, 345, 122, 18)); label3.setText("观察项目2:"); label3.setBounds(new Rectangle(170, 369, 72, 15)); choiceItem2.setBounds(new Rectangle(239, 367, 122, 18)); lblAgent.setText("选择智能体编号:"); lblAgent.setBounds(new Rectangle(435, 344, 107, 18)); choiceAgent.setBounds(new Rectangle(436, 363, 94, 17)); label5.setText("蓝色线"); label5.setBounds(new Rectangle(364, 345, 47, 17)); label6.setText("红色线"); label6.setBounds(new Rectangle(364, 365, 40, 18)); this.add(view, null); this.add(label2, null); this.add(choiceItem1, null); this.add(label3, null); this.add(choiceItem2, null); this.add(choicelen, null); this.add(label1, null); if(type==1){ this.add(lblAgent, null); this.add(choiceAgent, null); } this.add(label5, null); this.add(label6, null); this.pack(); this.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(WindowEvent e) { this_windowClosing(e); } }); } void this_windowClosing(WindowEvent e) { this.hide(); this.dispose(); } void btnClose_actionPerformed(ActionEvent e) { this.hide(); this.dispose(); } void this_windowOpened(WindowEvent e) { gra=view.getGraphics(); cyclemax=WorldVariants.cycleMax; repaint(); if(runner1==null){ runner1=new Thread(this); runner1.start(); } } public void paint(Graphics g) { /**@todo: Override this java.awt.Component method*/ //画图函数 Vector history=new Vector(); double value1max=100; double value1min=-100; double value2max=100; double value2min=-100; double valuemax=100; double valuemin=-100; boolean noneItem,isDrawn; String sName=""; if(type==0){ history=local.world.Histories; }else if(type==1){ nAgentIndex=choiceAgent.getSelectedIndex(); Agent ag=(Agent)local.agentList.elementAt(nAgentIndex); history=ag.History; } int width=517-originx-25; int height=316-originy; //int step=localpd.steps; int step=local.modelTime; int nStart=0; int nEnd=cycles; int size=history.size(); if(step-cycles>0){ //计算需要绘制的历史数据数组中的启示索引 nStart=step-cycles; } //清空画图区域 gra.clearRect(0,0,517,316); //设定原点坐标 int x=0,y=0,y0=height-originy; //对设定的要画的横坐标点数循环 noneItem=false; for(int i=0;i<cycles;i++){ //当前点坐标 isDrawn=true; int x1=(int)((i*width)/cycles); double value1=0; double value2=0; if((i+nStart)%cyclemax<size){ if(type==0){ WorldVariants wv=(WorldVariants)history.elementAt((i+nStart)%cyclemax); switch(choiceItem1.getSelectedIndex()){ case 0: value1=wv.price; if(i==0)sName="价格"; value1max=local.asmModelParams.maxprice; value1min=local.asmModelParams.minprice; break; case 1: value1=wv.dividend; if(i==0)sName="股息"; value1max=local.asmModelParams.maxdividend; value1min=local.asmModelParams.mindividend; break; case 2: if(i==0)sName="股息/利息"; value1=wv.risk_neutral; value1max=local.asmModelParams.maxprice; value1min=local.asmModelParams.minprice; break; } switch(choiceItem2.getSelectedIndex()){ case 0: value2=wv.price; value2max=local.asmModelParams.maxprice; value2min=local.asmModelParams.minprice; break; case 1: value2=wv.dividend; if(i==0)sName+="-股息"; value2max=local.asmModelParams.maxdividend; value2min=local.asmModelParams.mindividend; break; case 2: if(i==0)sName+="-股息/利息"; value2=wv.risk_neutral; value2max=local.asmModelParams.maxprice; value2min=local.asmModelParams.minprice; break; case 3: noneItem=true; value2=value1min; value2max=value1max; value2min=value1min; } }else if(type==1){ AgentVariants agv=(AgentVariants)history.elementAt((i+nStart)%cyclemax); if(i==0)sName=choiceItem1.getSelectedItem(); switch (choiceItem1.getSelectedIndex()){ case 0: value1=agv.demand; value1max=local.bfParams.maxbid; value1min=-value1max; break; case 1: value1=agv.wealth; value1max=local.asmModelParams.initialcash*10 + local.asmModelParams.maxprice*local.asmModelParams.initholding; value1min=0; break; case 2: value1=agv.position; value1max=local.asmModelParams.initholding; value1min=0; break; case 3: value1=agv.cash; value1max=local.asmModelParams.initialcash*10; value1min=0; break; case 4: value1=agv.avspecificity; value1max=local.bfParams.condbits; value1min=0; break; case 5: value1=agv.forecast; value1max=local.asmModelParams.maxprice; value1min=local.asmModelParams.minprice; break; case 6: value1=agv.realDeviation; value1max=local.asmModelParams.maxprice-local.asmModelParams.minprice; value1min=-value1max; break; case 7: value1=agv.pdcoeff; value1max=local.bfParams.a_max; value1min=0; break; case 8: value1=agv.offset; value1max=local.bfParams.b_max; value1min=local.bfParams.b_min; break; } switch (choiceItem2.getSelectedIndex()){ case 0: value2=agv.demand; value2max=local.bfParams.maxbid; value2min=-value2max; break; case 1: value2=agv.wealth; value2max=local.asmModelParams.initialcash*10 + local.asmModelParams.maxprice*local.asmModelParams.initholding;; value2min=0; break; case 2: value2=agv.position; value2max=local.asmModelParams.initholding; value2min=0; break; case 3: value2=agv.cash; value2max=local.asmModelParams.initialcash*10; value2min=0; break; case 4: value2=agv.avspecificity; value2max=local.bfParams.condbits; value2min=0; break; case 5: value2=agv.forecast; value2max=local.asmModelParams.maxprice; value2min=local.asmModelParams.minprice; break; case 6: value2=agv.realDeviation; value2max=local.asmModelParams.maxprice-local.asmModelParams.minprice; value2min=-value1max; break; case 7: value2=agv.pdcoeff; value2max=local.bfParams.a_max; value2min=0; break; case 8: value2=agv.offset; value2max=local.bfParams.b_max; value2min=local.bfParams.b_min; break; case 9: noneItem=true; value2=value1min; value2max=value1max; value2min=value1min; } if(i==0&&!noneItem)sName+="-"+choiceItem2.getSelectedItem(); } }else{ isDrawn=false; value1=valuemin; value2=valuemin; } valuemax=value1max; valuemin=value1min; if(!noneItem){ if(valuemax<value2max)valuemax=value2max; if(valuemin>value2min)valuemin=value2min; } if(valuemax==valuemin)valuemin=valuemax-100; int y1=(int)(height*(value1-valuemin)/(valuemax-valuemin)); //绘制合作者比例 if(y1<=0){ y1=1; }else if(y1>=height){ y1=height; } if(isDrawn){ gra.setColor(Color.blue); gra.drawLine(x+originx,height-y,x1+originx,height-y1); } //绘制不合作者比例 int y2=(int)(height*(value2-valuemin)/(valuemax-valuemin)); if(y2<=0){ y2=1; }else if(y2>=height){ y2=height; } if(isDrawn&&!noneItem){ gra.setColor(Color.red); gra.drawLine(x+originx,height-y0,x1+originx,height-y2); } //前一点的坐标 x=x1; y=y1; y0=y2; } //画坐标轴及其说明文字 gra.setColor(Color.black); gra.drawLine(originx,height,width+originx,height); gra.drawLine(originx,height,originx,0); gra.drawString("时间",width+originx,height); gra.drawString(sName,originx-35,originy/2); this.setTitle(sName+"(曲线图)"); for(int i=0;i<10;i++){ int x3=(int)(i*width/10)+originx; int y3=height; gra.drawLine(x3,y3,x3,y3-2); String txt; if(step>cycles){ txt=Integer.toString((int)(step-cycles+i*cycles/10)); }else{ txt=Integer.toString((int)(i*cycles/10)); } gra.drawString(txt,x3,y3+12); } for(int i=0;i<=9;i++){ int x3=originx; int y3=(int)((10-i)*height/10); gra.drawLine(x3,y3,x3+2,y3); float num=(float)((double)(i*(valuemax-valuemin))/(double)10+valuemin); String txt=Float.toString(num); if(txt.length()>=5)txt=txt.substring(0,5); gra.drawString(txt,x3-30,y3+5); } super.paint(g); } void choicelen_itemStateChanged(ItemEvent e) { cycles=(choicelen.getSelectedIndex()+1)*100; repaint(); } void btnRefresh_actionPerformed(ActionEvent e) { repaint(); } public void stop() { if (runner1!=null) { // running = false; runner1.stop(); runner1=null; } } public void run() { while(true){ repaint(); try{Thread.sleep(1000);}catch(InterruptedException e){}; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -