?? 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 + -