用Java繪製K線圖

2020-12-03 IT168

  【IT168技術文檔】

  Java語言中的Applet(Java小程序)和Application(Java應用程式)是在結構和功能上都存在很大差異的兩種不同的編程方式。Applet應用於Web頁上,可做出多姿多彩的頁面特效,給網站增輝添色;Application則與其他程式語言(如VB、VC)一樣,可編制各種應用程式。

  本文要討論的是第一種情況,在Web頁上用Java Applet繪製K線圖。

  K線是股市行情分析中的一種參數指標,用股票每日的開盤價、最高價、最低價、收盤價及成交量等數據進行作圖,配合五日、十日均線便可反映出一個階段內該支股票的漲跌走勢。

  Java Applet所做的K線圖多應用於證券類型的網站,以方便網上股民的分析操作。不過由於我國網速的關係,目前有些證券類網站把K線圖做成了圖片以節省下載的時間。當然,其繪製K線所用的工具(Java Applet)及繪製方法還是相同的。

  在編寫繪製K線的Java Applet時,有幾處關鍵問題要解決,即:1)多線程的使用;2)布局管理器的選擇;3)數據輸入、輸出流的應用;4)設置、監聽滑鼠與鍵盤事件。

  下面通過一個實例,來詳細闡述整個編程過程和方法。

  一、使用多線程

  一個完整的Java Applet包含四個方法,Init()、Start()、Stop()、Destroy()(即:初始化、開始、停止、清除),構成一個完整的生命周期,其運行次序也是由上而下順序執行。

  在繪製K線圖的過程中,除了要繪製窗體及代表股票升降的陰線、陽線矩形外,還要監聽滑鼠事件並同時繪製一個自由移動的「十字」遊標,來定位顯示所檢索股票每日的各種價格數值(如開盤價、收盤價等);這時,為了避免閃爍和減少重新計算的等待時間,除了重繪跟隨滑鼠移動的「十字」遊標外,對頁面的布局及陰線、陽線矩形等不進行重繪;這就需要應用多線程來完成該項任務。

  1.關於多線程的一些基本概念:

  多線程實際上就是啟動另一個進程,其運行的過程獨立於主程序之外,並從主程序的Start()方法載入、由Run()方法調用執行。實現多線程的方法有兩種,即:創建Thread類的子類(類的繼承)和實現runnable接口。

  為便於使用,Java把所有有關線程的功能封裝成Java類庫中的一個類:Java.lang.Thread。通過這個類,Java可以創建、控制和終止線程,完成有關多線程的所有操作。

  在Java語言中,一個子類只能繼承一個超類(父類),由於我們所要編寫的Java Applet是應用於網頁中的,首先必須繼承瀏覽器類(java.applet);因此,在本例中我們通過實現runnable接口的方法來實現多線程,實現的語句如下:

  public class StockApplet extends java.applet.Applet implements Runnable

  2.多線程的應用:

  首先,在Init()方法中對要創建的線程(M_pointThread)進行定義及初始化:

  Thread M_pointThread=null;

  然後,在Start()和Stop()方法中加入以下代碼:

  //當打開瀏覽器頁面開始載入Java Applet代碼時,執行start()方法

  public void start()

  {

  if (M_pointThread==null) //如果線程尚未產生

  {

  M_pointThread=new Thread(this); //則創建一個新線程

  M_pointThread.start(); //啟動該線程

  }

  }

  //在當前頁面關閉或轉向其他Web頁面時,調用stop()方法,以釋放系統資源

  public void stop()  {  if (M_pointThread!=null) //如果線程尚在運行  {  M_pointThread.stop(); //停止該線程  M_pointThread=null; //釋放線程所佔資源  }  }

  3.編寫線程運行的代碼:

  public void run()  {  M_graphics=getGraphics();  M_graphics.setXORMode(Color.white); //採用異或方法繪製「十字」遊標  while(true)  {  try  {  if(MouseMove==true) //偵測到滑鼠的移動後,執行以下代碼  { //當滑鼠位於以下區域(Java Applet布局)內時,執行畫線操作  if(x0 >50 && x0< 600){M_graphics.drawLine(x0,30,x0,380);}  if(y0 >30 && y0 <380){M_graphics.drawLine(50,y0,600,y0);}  if(X >50 && X< 600){M_graphics.drawLine(X,30,X,380);}  if(Y >30 && Y< 380){M_graphics.drawLine(50,Y,600,Y);}  MouseMove=fase;  x0=X; //傳遞當前座標參數  y0=Y;  }  }  catch(NullPointerException npe){} //捕獲可能出現的異常  }

  二、布局管理器

  本例中的Java Applet運行時,要在頁面上Java Applet的運行區域內繪製相應的「標籤」來顯示不同的數值,並要加入一個「文本框」來接收輸入的股票代碼。對這些「標籤」和「文本框」位置及大小的設定,便屬於布局管理的應用範疇。

  Java語言中提供的布局管理器種類有:邊界式布局、卡片式布局、流式布局和網格式布局等,各有不同的特點,可根據實際需要選用;但有最大自由設計空間的是「無布局管理器」——即不使用任何布局格式,而通過手工方式添加組件到頁面布局的絕對位置上。本例中使用的便是「無布局管理器」。

  在使用「無布局管理器」時,首先要作出聲明,即:

  setLayout(null);

  然後用reshape()方法指定組件的具體位置和尺寸,

  基本語句如下所示:

  Label label1=new Label(); //定義標籤

  this.add(label1);   //把標籤加入布局管理器

  label1.reshape(10,10,30,30); //在指定位置繪製標籤

  對於多個標籤和文本框,參照此格式添加即可。

  三、輸入、輸出數據流

  Java Applet在客戶端瀏覽器上運行時,要從伺服器端讀取股票的相關數據進行做圖,這就涉及到Java數據流的運用。

  Java.io包提供了多個用於與各種I/O設備交換信息的類,其最頂層的兩個類便是輸入流類(InputStream)和輸出流類(OutputStream)。

  為了便於實現,在本例中我們先在伺服器端把股票資料庫(如:show128.dbf)中的有關欄位寫入一文本文件中(其格式為:第一行為股票的漢字名稱,以後每一行內包括:開盤日期、開盤價、最高價、最低價、收盤價、成交量),並以該支股票的代碼作為文件名(如:600001.txt);然後,再用Java Applet從伺服器端的文本文件中讀取數據。這樣,就把對伺服器端資料庫的訪問轉化為對文件的I/O操作,實現的語句如下:

  URL urlc=new URL("http://127.0.0.1/"+FileName+".txt");

  BufferedReader bis=new BufferedReader(new InputStreamReader(urlc.openStream()));

  註:第一條語句中的http://127.0.0.1/為在本機執行調試操作的URL地址,在上傳到伺服器上後要做相應的修改;FileName為要讀取的文本文件名。

  第二條語句定義了讀取輸入數據流的方法。

  四、監聽鍵盤及滑鼠事件

  在Java Applet小程序中,單擊按鈕、鍵入文本、使用滑鼠或執行任何與界面相關的動作時,就發生一個事件,小程序就會作出適當的反應。

  在本例中,我們通過使用action()方法來獲得Java Applet小程序運行時所發生的事件。語句格式如下:

  public boolean action(Event evt,Object arg)  {  FileName=text1.getText(); //提取文本框中輸入的參數  ReadData();  //調用讀數據流數據的方法  return true; //處理完畢,不需要其他方法再做處理  }

  上面的action()方法中含有兩個參數:一個是Event類的一個對象evt;另一個是Object類的一個對象arg。Event對象告訴我們發生了哪種事件,而Object對象將進一步告訴我們有關該事件的情況。每當有Event監聽的事件發生時,Java Applet便自動調用該action()方法。

  至此,在掌握了上述編程中的一些要點後,我們便可以成功地編制出一個完整的繪製K線的Java Applet小程序了(完整的原始碼下載)。

  五、編制HTML文檔(Stock.html)

  程序編制完成後,另外要做的是設置在Web頁面上調用Java Applet的頁面,即編制HTML文檔。Stock.html文檔的示例代碼如下:

<HTML>< HEAD >< TITLE >股票K線圖< /TITLE >< /HEAD ><body bgcolor=#00ffff ><APPLET code=StockApplet.class name=StockApplet HEIGHT=500 WIDTH=400></APPLET >< /body >< /HTML >

  在< APPLET >< /APPLET >標籤對內,是對Java Applet小程序的調用代碼。其中的StockApplet.class是經編譯後生成的class文件,codeBase指向的是class文件所存放的路徑。如果class文件與HTML文檔存放在同一目錄下,則可以省略這一項。

  至此,編制Java Applet小程序的工作便全部完成。

  在個人計算機上進行調試時,首先要安裝個人Web服務,然後,把StockApplet.class與HTML文檔一起拷貝到本機的WWW服務目錄下(如:C:\Inetpub\wwwroot\),打開瀏覽器,在地址欄內輸入http://127.0.0.1/Stock.html,回車,進行測試操作。

  調試通過後,便可上傳至伺服器投入運行了。

相關焦點

  • 如何看黃金K線圖?
    如何看黃金K線圖?黃金走勢圖K線圖是把一定時間內黃金交易市場的價格、時間、交易量等信息用曲線或K線在坐標圖上加以顯示的技術圖形。作為剛入門的新手,怎樣在炒黃金過程中黃金走勢圖呢? 先熟悉下黃金代碼。
  • 黃金K線走勢圖
    黃金k線走勢圖是什麼?做貴金屬黃金投資的人首先要接觸的肯定是黃金k線走勢圖,這是最基礎的投資知識。今天小編就來給您介紹一下什麼是黃金k線走勢圖? 黃金K線走勢圖就是把一定時間內黃金交易市場的價格、時間、交易量等信息用曲線或K線在坐標圖上加以顯示的技術圖形。 黃金走勢圖上的線根據計算單位的不同,一般分為:日k線、周k線、月k線與分鐘k線。它的形成取決於每一計算單位中的四個數據,即:開盤價、最高價、最低價、收盤價。
  • 跟我學java編程—認識java語言的字符類型
    用記事本打開「CharSample.java」文件,輸入以下代碼:編譯「CharSample.java」文件,在命令行窗口輸入「javac CharSample.java」並執行命令,編譯通過後,在命令行窗口輸入「java CharSample」運行Java程序,命令行窗口顯示如下信息:
  • 外匯k線圖基礎知識之K線技術分析方法
    外匯K線圖也被稱為外匯蠟燭圖,這種K線走勢的緣由來源於德川幕府時代的米市交易,用來計算每天大米價格的漲跌,因為其應用較為簡單直觀,後來被運用到金融市場中,比如外匯、股票、期貨等。今天我們來學習一下外匯K線圖基礎知識。
  • 如何用R繪製精美的散點圖
    R可以繪製出很棒的統計圖形,之前我們介紹了用R繪製柱狀圖。今天,小編帶著小夥伴們一起來了解下散點圖的繪製。小編自己看代碼的時候也覺得枯燥乏味,看圖片比看代碼輕鬆多了。所以我們先上圖。上圖就是通過R繪製出的散點圖,看起來也很漂亮。那麼,這種散點圖是如何繪製的呢?感興趣的小夥伴就請繼續看下面的代碼。
  • 短線高手直言:精準識別60分鐘K線圖MACD買賣點,盈利變得很簡單
    60分鐘K線圖MACD買賣點:60分鐘屬短期波動,一日的1/4,而MACD屬中期趨勢,60分鐘MACD作為短周期的中線指標,是極佳的超級短線秘籍。1、選出近期成交突然連續放大,日換手10%以上,大幅上漲(最好出現漲停)的個股觀察。
  • 用Illustrator軟體繪製三種立體透視圖
    繪製透視圖  ,本文會先介紹一些透視圖的理論知識,然後再介紹單點透視圖、兩點透視圖、三點透視圖的實例。比如:繪製工程圖紙或者藍圖。  本教程不會去討論那些精確的、使用數學運算的方法,所有的這些方法中,重點都是集中於視平線的法則。下面讓我們用Illustrator來深入了解使用消失點(滅點)和視平線繪製立體透視圖的方法吧。建立視平線  繪製一個透視圖是很簡單的。
  • 俄用天文望遠鏡繪製宇宙圖
    重要發現此前只是軟X射線範圍內才有較清晰的全天空圖,由德國ROSAT天文臺於30年前繪製。硬X射線範圍內有清晰度比較差的天空圖,由美國航天局RXTE天文臺和國際空間站日本儀器MAXI共同繪製。德國科學家在繪製另一半天空圖。兩個「半球」將覆蓋整個天空。俄羅斯航天集團宣布,此次獲得的觀測圖角解析度不到1弧分,成為其獨特之處,此前只在軟X射線範圍內(能量低於2KeV)才有較清晰的全天空圖。現在用小比例尺硬X射線宇宙地形圖代替了只標出主要地形特點的大比例尺宇宙圖。
  • 俄用天文望遠鏡繪製宇宙圖
    重要發現此前只是軟X射線範圍內才有較清晰的全天空圖,由德國ROSAT天文臺於30年前繪製。硬X射線範圍內有清晰度比較差的天空圖,由美國航天局RXTE天文臺和國際空間站日本儀器MAXI共同繪製。德國科學家在繪製另一半天空圖。兩個「半球」將覆蓋整個天空。俄羅斯航天集團宣布,此次獲得的觀測圖角解析度不到1弧分,成為其獨特之處,此前只在軟X射線範圍內(能量低於2KeV)才有較清晰的全天空圖。現在用小比例尺硬X射線宇宙地形圖代替了只標出主要地形特點的大比例尺宇宙圖。
  • JAVA校招題基礎知識點複習第六天(一張圖搞懂所有集合特點)
    集合其實和數組一樣都是java中提供的一種容器,可以用來存儲多個數據。既然集合和數組都容器,那麼他們有什麼區別呢?1、數組的長度是固定的,集合的長度是可變的。在JAVA中,集合按照其存儲結構可以分為兩大類,分別是單列集合java.util.Collection和雙列集合java.util.Map。Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。
  • 亦明圖記:SolidWorks繪製方形螺旋筆筒,用曲面繪製掃描輪廓曲線
    3d方形螺旋筆筒模型:使用SolidWorks2014繪製繪製過程:1、在上視基準面上繪製草圖 中心矩形:邊長100;倒圓角R10;2、拉伸曲面:給定深度150;3、在前視基準面上繪製草圖 豎直直線;4、再次在前視基準面上繪製草圖水平直線;5、掃描曲面:輪廓選擇水平直線;路徑選擇豎直直線;方向/扭轉控制選擇沿路徑扭轉,定義方式旋轉,20圈;6、繪製3D草圖,選擇交叉曲線命令:選擇實體拉伸的曲面和掃描的曲面
  • 用經典案例來幫助初學者解析Java的「多態」
    我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!這裡給大家帶來以下幾個類、接口:接口Shape.java2.實現接口Shape.java的實現類之一 Circle.java即圓形類:如上,Circle類實現了接口Shape.java中的若干抽象方法
  • 零件圖繪製步驟
    零件圖繪製步驟一、視圖1、基本視圖六個基本視圖的繪製,可在三視圖的基礎上進行,繪製三視圖的時候,儘量使用OFFSET偏移命令,繪製等距線。有了三視圖,可以使用MIRROR影射命令。如有了左視圖,右視圖可以對左視圖進行映射,移動到適當的位置,再使用PROPERTIES命令對視圖中的線型進行轉換。
  • 跟我學java編程—Java邏輯運算符
    示例1:邏輯運算符在D盤Java目錄下,新建「LogicSample.java」文件。用記事本打開「LogicSample.java」文件,輸入以下代碼:代碼結構分析程序功能主要是演示邏輯運算符的用法。類似語句「bJudge = !
  • 為什麼走勢分解的最小單位不是k線,而是分型和筆?
    為什麼走勢分解的最小單位不是k線,而是分型和筆?
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    首先,用matplotlib庫的bar()函數繪製堆積柱狀圖哦bar()函數作為matplotlib庫的專用柱狀圖繪製函數,相信大家已經熟悉它的調用方式了哦,現在咱們就看看如何繪製堆積柱狀圖吧!好啦,說完了堆積柱狀圖,咱們再深入聊一點,來看一下堆積柱狀圖的變體吧,如何繪製堆積條形圖哦!
  • java操作ES整個流程介紹
    一 準備工作下載elasticsearch-6.7.0和展示ES數據的界面工具elasticsearch-head-master,本人電腦已安裝IntelliJ IDEA 2019.3 x64的java工具。簡單點,我們直接按默認配置學習。windows直接點擊elasticsearch.bat啟動ES。
  • 縱斷面圖地面線的繪製
    【學員問題】縱斷面圖地面線的繪製?  【解答】公路縱斷面圖是沿中線方向繪製地面起伏和縱坡變化的線狀圖,它是反映各路段縱坡大小和中線上的填挖尺寸,是公路設計和施工中的重要資料。  公路縱斷面圖是以裡程為橫坐標,高程為縱坐標繪製的。
  • 一文學會用Python繪製經典的棉棒圖、箱線圖和誤差棒圖
    這幾天一直在和大家聊Python數據可視化相關的東東,其中呢,介紹最多的當然是matplotlib庫中的各種繪製函數啦,上次已經和大家談論了關於Python中如何繪製氣泡圖等漂亮圖表的方式,今天呢,咱們繼續聊哦,今天呢,咱們就來聊聊如何繪製經典的棉棒圖、箱線圖和誤差棒圖
  • 如何用java判斷一個數是不是質數?
    哈嘍大家好,這是java小白成長記!昨天分享了怎麼判斷一個數是不是迴文數,目的是為了鞏固一下if選擇語句和求餘數運算符,今天分享一下怎麼判斷一個數是不是質數,可以鞏固for循環、if選擇語句、還有沒怎麼使用過的基本數據類型Boolean。