- - PR -
Java Appletで動的なグラフ作成
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-12-22 17:07
初めまして、酒井と申します。
Web上で気温チャートや、株価のチャートを出力するものを作りたいと考えています。色々とサンプルを探してみたのですが、JavaAppletで実現できるということまでしか分かりませんでした。 やりたいことは以下の二つです。 1.JavaAppletを使用し、クライアント側でグラフを作図すること。 2.10秒ごとに自動リロードしグラフが動的に更新されること。 ・・・その際にサーバプログラムには特にパラメータを渡さず、サーバプログラムはある特定のDBのテーブルの中身をみてパラメータをクライアントに返すというものです。 どなたか、ヒントかサンプルの場所等を教えて頂けないでしょうか? | ||||
|
投稿日時: 2003-12-22 20:02
グラフ作成に関しては、商用、オープンソースを含めいろいろあると思いますが、
オープンソースもので私が把握しているグラフ作成フレームワークは 前者は、IBMのDevelopper Worksで紹介されたのでそちらを参照してください。 後者は、アーカイブを展開していないので、どんなものかまったく分かりません。 | ||||
|
投稿日時: 2003-12-22 23:33
お世話になっております。
WEB+DB PRESS vol.17において、JFreeChartの簡単なサンプルなどが掲載されていました。 ただ、この記事では、どちらかというとサーバ側で動的に作成してブラウザに内容を表示、といった感じの使い方がメインですが、Swing版のサンプルもあるそうなので、Appletからでも使えるのではないかと思います(私自身もJFreeChartは試したことがないので)。 もちろん、Serverで処理をしてしまって、Appletを使わずに完結させることも可能です。 #既にvol.18が出ているので、書店によってはもう置いていないかもしれません。 (家の近くの本屋では、たま〜にバックナンバーが残っていたりします) | ||||
|
投稿日時: 2003-12-23 02:01
1.は、AppletでGraphicsまたはGraphics2Dクラスのメソッドを利用して 描画すると実現できます。 2.はちょっと面倒ですが、サーバ側でサーブレットを使用できるならば ObjectInputStream/ObjectOutputStreamを使って必要なデータを送受する 方法があります。Applet側でスレッドを1つ作成し、10秒毎にサーブレット へ接続して必要なデータを受け取ります。 URLクラスのopenConnectionメソッド、URLConnectionクラスのgetOutputStream メソッド、などを使用します。 "Applet Servlet 通信"で検索すればいろいろ例が見つかると思います。 紹介されていたJFreeChartはGraphics2Dクラスのメソッド(Java2D API)を 使用するものなので、Appletでも使用可能です。 ただし、そのときはJFreeChartのライブラリ(JARファイル)を、Appletコード と一緒にダウンロードできるよう設定する必要があります。 | ||||
|
投稿日時: 2003-12-25 10:49
亀レスですが・・・。下記は来年1月から開始されるプロジェクト用に、 私が作成したサーブレットでグラフを作成するサンプルです。 アプレットでも基本は同じなので、 もしまだ解決されていないなら参考にしてみて下さい。 サンプルなので、かなり適当ですが・・・・。 //ImageServlet import java.awt.*; import java.awt.image.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.imageio.*; public class ImageServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { byte[] imageByte = new byte[0]; BufferedImage img = null; Graphics g = null; BufferedInputStream in = null; img = new BufferedImage(1080, 520, BufferedImage.TYPE_INT_BGR); g = img.getGraphics(); //グラフ用紙を描画 drawBackLine(g,20,1080,520,60,100); //グラフの見出しを描画 drawCaption(g,20,1080,520,60,100); //グラフの条件を描画 drawTerm(g,60,100); //グラフを描画 drawGraph(g,20,1080,520,60,100); try { ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(img,"png",out); imageByte = out.toByteArray(); out.flush(); out.close(); }catch(IllegalArgumentException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } response.setContentType("image/png"); response.setContentLength(imageByte.length); response.getOutputStream().write(imageByte); imageByte = null; img = null; g = null; in = null; } private void drawBackLine(Graphics g,int unit,int width,int hight,int yohakuX,int yohakuY){ //背景を白で塗りつぶす g.setColor(Color.WHITE); g.fillRect(0,0,width,hight); //掛け線を引く g.setColor(Color.BLACK); for(int i=0;(i * unit) <= (width-yohakuX * 2);i++) g.drawLine(i * unit+yohakuX,yohakuY,i * unit+yohakuX,hight-yohakuY); for(int i=0;(i * unit) <= (hight-yohakuY * 2);i++) g.drawLine(yohakuX,hight-(i * unit)-yohakuY,width-yohakuX,hight-(i * unit)-yohakuY); } private void drawCaption(Graphics g,int unit,int width,int hight,int yohakuX,int yohakuY){ String drawStr = null; //X軸の見出しを描画 for(int i=0;(i * unit) < (width-yohakuX * 2);i++) if(Math.IEEEremainder(i-1,2)==0){ g.drawString(Integer.toString((i-1)/2),i * unit+yohakuX-5,hight-yohakuY+15); g.drawString(Integer.toString((i-1)/2),i * unit+yohakuX-5,yohakuY-5); } g.drawString("↑",15,hight-yohakuY-30); g.drawString("数",15,hight-yohakuY-15); g.drawString("量",15,hight-yohakuY); //Y軸の見出しを描画 for(int i=0;(i * unit) < (hight-yohakuY * 2);i++){ if(i==0) drawStr = " 0"; else if(i<10) drawStr=" " + Integer.toString(i * 10); else drawStr=Integer.toString(i * 10); g.drawString(drawStr,yohakuX-30,hight-(i * unit)-yohakuY); g.drawString(drawStr,width-yohakuX,hight-(i * unit)-yohakuY); } g.drawString("時間→",yohakuX-5,hight-yohakuY+30); g.setColor(Color.BLUE); g.fillRect(yohakuX-5,hight-yohakuY+40,20,20); g.setColor(Color.BLACK); g.drawString("生産数量",yohakuX+20,hight-yohakuY+55); g.setColor(Color.CYAN); g.fillRect(yohakuX+80,hight-yohakuY+40,20,20); g.setColor(Color.BLACK); g.drawString("販売数量",yohakuX+105,hight-yohakuY+55); } private void drawTerm(Graphics g,int yohakuX,int yohakuY){ g.setColor(Color.BLACK); g.drawString("店 舗:店舗101",yohakuX-5,yohakuY-35); g.drawString("呼 出:4032 国産うなぎ蒲焼き",yohakuX-5,yohakuY-20); g.drawString("日付:2003年9月1日(月)",yohakuX+150,yohakuY-35); } private void drawGraph(Graphics g,int unit,int width,int hight,int yohakuX,int yohakuY){ int[] x1 = new int[]{(2*8+1) * unit+yohakuX, (2*9+1) * unit+yohakuX, (2*10+1) * unit+yohakuX, (2*11+1) * unit+yohakuX, (2*12+1) * unit+yohakuX, (2*13+1) * unit+yohakuX, (2*14+1) * unit+yohakuX, (2*15+1) * unit+yohakuX, (2*16+1) * unit+yohakuX, (2*17+1) * unit+yohakuX, (2*18+1) * unit+yohakuX, (2*19+1) * unit+yohakuX, (2*20+1) * unit+yohakuX, (2*21+1) * unit+yohakuX, (2*21+1) * unit+yohakuX}; int[] y1 = new int[]{hight-(0 * unit / 10)-yohakuY, hight-(9 * unit / 10)-yohakuY, hight-(21 * unit / 10)-yohakuY, hight-(61 * unit / 10)-yohakuY, hight-(64 * unit / 10)-yohakuY, hight-(66 * unit / 10)-yohakuY, hight-(78 * unit / 10)-yohakuY, hight-(103 * unit / 10)-yohakuY, hight-(103 * unit / 10)-yohakuY, hight-(121 * unit / 10)-yohakuY, hight-(121 * unit / 10)-yohakuY, hight-(121 * unit / 10)-yohakuY, hight-(121 * unit / 10)-yohakuY, hight-(121 * unit / 10)-yohakuY, hight-(0 * unit / 10)-yohakuY}; int[] x2 = new int[]{(2*8+1) * unit+yohakuX, (2*9+1) * unit+yohakuX, (2*10+1) * unit+yohakuX, (2*11+1) * unit+yohakuX, (2*12+1) * unit+yohakuX, (2*13+1) * unit+yohakuX, (2*14+1) * unit+yohakuX, (2*15+1) * unit+yohakuX, (2*16+1) * unit+yohakuX, (2*17+1) * unit+yohakuX, (2*18+1) * unit+yohakuX, (2*19+1) * unit+yohakuX, (2*20+1) * unit+yohakuX, (2*21+1) * unit+yohakuX, (2*21+1) * unit+yohakuX}; int[] y2 = new int[]{hight-(0 * unit / 10)-yohakuY, hight-(5 * unit / 10)-yohakuY, hight-(10 * unit / 10)-yohakuY, hight-(30 * unit / 10)-yohakuY, hight-(32 * unit / 10)-yohakuY, hight-(33 * unit / 10)-yohakuY, hight-(39 * unit / 10)-yohakuY, hight-(51 * unit / 10)-yohakuY, hight-(51 * unit / 10)-yohakuY, hight-(60 * unit / 10)-yohakuY, hight-(60 * unit / 10)-yohakuY, hight-(60 * unit / 10)-yohakuY, hight-(60 * unit / 10)-yohakuY, hight-(60 * unit / 10)-yohakuY, hight-(0 * unit / 10)-yohakuY}; g.setColor(Color.BLUE); g.fillPolygon(x1,y1,x1.length); g.setColor(Color.CYAN); g.fillPolygon(x2,y2,x2.length); } } | ||||
|
投稿日時: 2004-01-20 19:16
はじめまして、私は現在サーバサイドJavaを用いた
Webアプリケーションの開発に取り組んでいるところです。 ゆうさんへのレスではなく、takuさんのレスに対する質問をさせてください。 >takuさん takuさんの着手するプロジェクトでのサーバのOSはWindowsなのでしょうか? 私も同じようなことをRedHatLinux9で実行しようとしているのですが、 awtでのグラフィック処理を行おうとすると、HttpStatusの500が表示され、 ServletExeptionが発生したことが報告されます。 javax.servlet.ServletException: Invoker service() exception そして、以下のようなエラーが検出されていました。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable. at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method) at sun.awt.X11GraphicsEnvironment.(X11GraphicsEnvironment.java:125) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:140) at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62) at java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1041) at java.awt.image.BufferedImage.getGraphics(BufferedImage.java:1031) at Jpeg.processRequest(Jpeg.java:16) at Jpeg.doGet(Jpeg.java:22) 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ソースは以下のようになっています。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 import java.awt.*; import java.awt.image.*; import java.util.Iterator; import javax.imageio.*; import javax.servlet.*; import javax.servlet.http.*; public class Jpeg extends HttpServlet { protected void processRequest( HttpServletRequest request, HttpServletResponse response ) throws ServletException, java.io.IOException { response.setContentType( "image/jpeg" ); BufferedImage bimg = new BufferedImage( 200, 150, BufferedImage.TYPE_INT_RGB ); Graphics g = bimg.getGraphics(); } public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException { processRequest( request, response ); } 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 普通のJavaで次のようなコードを試すと、 GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); この部分でInternalErrorが検出されているようです。 ちなみに開発環境は以下の通りです。 j2sdk1.4.1_06 Tomcat4.1.24 とりあえずPJAを使用すれば、Linux環境でもAWTが正常に使えるということが わかったのですが、そのPJAを導入するには、具体的に どうすればよいのでしょうか? どなたかご教示ください。 | ||||
|
投稿日時: 2004-01-20 21:14
未確認で申し訳ないのですが、
j2se1.4 以降は PJA を使わなくても、コマンドラインに -Djava.awt.headless=true を指定すれば、サーバーサイド awt が使えるようです。 http://java.sun.com/j2se/1.4.2/docs/guide/awt/AWTChanges.html#headless | ||||
|
投稿日時: 2004-01-20 21:37
補足事項 もろ、そのまんまのスレッドが立っています ご覧あれ。 | ||||
