- PR -

Java Appletで動的なグラフ作成

投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2003-12-22 17:07
初めまして、酒井と申します。
Web上で気温チャートや、株価のチャートを出力するものを作りたいと考えています。色々とサンプルを探してみたのですが、JavaAppletで実現できるということまでしか分かりませんでした。
やりたいことは以下の二つです。
1.JavaAppletを使用し、クライアント側でグラフを作図すること。
2.10秒ごとに自動リロードしグラフが動的に更新されること。
・・・その際にサーバプログラムには特にパラメータを渡さず、サーバプログラムはある特定のDBのテーブルの中身をみてパラメータをクライアントに返すというものです。
どなたか、ヒントかサンプルの場所等を教えて頂けないでしょうか?
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-22 20:02
グラフ作成に関しては、商用、オープンソースを含めいろいろあると思いますが、
オープンソースもので私が把握しているグラフ作成フレームワークは

前者は、IBMのDevelopper Worksで紹介されたのでそちらを参照してください。
後者は、アーカイブを展開していないので、どんなものかまったく分かりません。
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2003-12-22 23:33
お世話になっております。

引用:

後者は、アーカイブを展開していないので、どんなものかまったく分かりません。



WEB+DB PRESS vol.17において、JFreeChartの簡単なサンプルなどが掲載されていました。
ただ、この記事では、どちらかというとサーバ側で動的に作成してブラウザに内容を表示、といった感じの使い方がメインですが、Swing版のサンプルもあるそうなので、Appletからでも使えるのではないかと思います(私自身もJFreeChartは試したことがないので)。
もちろん、Serverで処理をしてしまって、Appletを使わずに完結させることも可能です。

#既にvol.18が出ているので、書店によってはもう置いていないかもしれません。
 (家の近くの本屋では、たま〜にバックナンバーが残っていたりします)
ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2003-12-23 02:01
引用:

1.JavaAppletを使用し、クライアント側でグラフを作図すること。
2.10秒ごとに自動リロードしグラフが動的に更新されること。


1.は、AppletでGraphicsまたはGraphics2Dクラスのメソッドを利用して
描画すると実現できます。
2.はちょっと面倒ですが、サーバ側でサーブレットを使用できるならば
ObjectInputStream/ObjectOutputStreamを使って必要なデータを送受する
方法があります。Applet側でスレッドを1つ作成し、10秒毎にサーブレット
へ接続して必要なデータを受け取ります。
URLクラスのopenConnectionメソッド、URLConnectionクラスのgetOutputStream
メソッド、などを使用します。
"Applet Servlet 通信"で検索すればいろいろ例が見つかると思います。

紹介されていたJFreeChartはGraphics2Dクラスのメソッド(Java2D API)を
使用するものなので、Appletでも使用可能です。
ただし、そのときはJFreeChartのライブラリ(JARファイル)を、Appletコード
と一緒にダウンロードできるよう設定する必要があります。

taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 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);

}
}
taki
会議室デビュー日: 2004/01/20
投稿数: 2
投稿日時: 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を導入するには、具体的に
どうすればよいのでしょうか?
どなたかご教示ください。
Keisuke
大ベテラン
会議室デビュー日: 2003/10/24
投稿数: 105
投稿日時: 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
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-01-20 21:37
引用:

未確認で申し訳ないのですが、

j2se1.4 以降は PJA を使わなくても、コマンドラインに
-Djava.awt.headless=true
を指定すれば、サーバーサイド awt が使えるようです。



補足事項
もろ、そのまんまのスレッドが立っています
ご覧あれ。

スキルアップ/キャリアアップ(JOB@IT)