その7 ファイル操作の為に、アプレットからアプリケーションヘ


 さて、この装置の欠点である一つに、アプレットを使用している為に、Javaの制限事項であるクライア ント側のパソコン上へのファイルの読み書きが出来ない事だ。

 アプリケーションにして、XPortのデーターをパソコン自身で読み込みに行けば、この制限事項は無くなる。データーを読み込み、ファイルとして保存し たり、保存しておいたファイルを、後から表示したりできる様になる。

 簡単そうだが、Javaの実戦経験が全くない私には、途方も無いことである。自分のスキルアップの為にもTempLanのアプリケーション化をしてみ た。やはり、一番理解できていなかった事は、オブジェクト指向言語であるJavaのクラスの扱い方だった。ようやく下記サンプルを作ったが、未だにデー ターの入出力部分を書き加えるまでに至っていない。アプリケーション化するのにずいぶん時間がかかってしまった。

 もっと良い方法があると思いますが、あくまでサンプルということで自己満足バージョンです。

 ファイルの入出力を加えたバージョンも開発中(?)です。
Javaで下記ファイルをファイル名
Plotting.java
としてコンパイルすればそのままアプリケーションとしてXPortから情報を受け取って表示します。
下記行の"192.168.24.50"のところを自分XPoetに設定したIPアドレスに書き換えて下さい。

public static String xport_ip = "192.168.24.50";//XPortに設定してあるIPアドレスをここで宣言しておく
// TempLan35 Now Max. Min.(アプリケーション型)
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.awt.image.BufferedImage;

public class Plotting extends JPanel{
    Point prevp, newp;
    Sensor sensor;
    int xMax, yMax, yConst;
    double tMax, tMin;
    BufferedImage bi;
    Graphics G;
    public static String xport_ip = "192.168.24.50";//XPortに設定してあるIPアドレスをここで宣言しておく

    public Plotting(Point startp){

        prevp = newp = startp;
        xMax = 750;
        yConst = 10;
        yMax = 550;
        tMax = 0;
        tMin = 50.0;
       
        sensor = new Sensor();
    }

    public void doPlot(){

        while (true){

            if(newp.x > xMax ){
                prevp.x = 49;
                initG();
            }

            double data = sensor.readData();
           
            int y = yMax - (int)((double)yConst * data); //小数点以下1桁分を10倍して整数化する
            int x = prevp.x + 1;
            if(tMax < data){
                tMax = data;
            }

            if(tMin > data){
                tMin = data;
            }

            newp = new Point(x, y);
            repaint(); //上の4行で描画用パラメータをセットし、描画をリクエストする
            try{
                Thread.sleep(60);
            }
            catch (InterruptedException ie){
                ie.printStackTrace();
            }
            prevp = newp;
        }
    }
   

    public void initG(){

        G = bi.createGraphics();
        G.setColor(Color.white); //背景色
        G.fillRect(0, 0, getWidth(), getHeight());

        G.setColor(Color.black);
        G.setFont(new Font("Serif",Font.BOLD,18));
        G.drawLine( 45, 550, 750, 550);    // 時間軸
        G.drawString(" 0",20,555);
        G.drawLine( 50, 555, 50, 50);    // 温度軸

        G.drawLine( 45, 500, 750, 500);    // 5度
        G.drawString(" 5",20,505);

        G.drawLine( 45, 450, 750, 450);    // 10度
        G.drawString("10",20,455);

        G.drawLine( 45, 400, 750, 400);    // 15度
        G.drawString("15",20,405);

        G.drawLine( 45, 350, 750, 350);    // 20度
        G.drawString("20",20,355);

        G.drawLine( 45, 300, 750, 300);    // 25度
        G.drawString("25",20,305);

        G.drawLine( 45, 250, 750, 250);    // 30度
        G.drawString("30",20,255);

        G.drawLine( 45, 200, 750, 200);    // 35度
        G.drawString("35",20,205);

        G.drawLine( 45, 150, 750, 150);    // 40度
        G.drawString("40",20,155);

        G.drawLine( 45, 100, 750, 100);    // 45度
        G.drawString("45",20,105);

        G.drawLine( 45, 50, 750, 50);    // 50度
        G.drawString("50",20,55);
    }


    public void paintComponent(Graphics g){
        if (bi == null){ // BufferdImageを用意する
            bi = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            initG();
        }

        super.paintComponent(g);
   
        Font CurrentFont = G.getFont();
       
        Font font = new Font("Serif", Font.PLAIN , 24);
        G.setFont(font);
       
        G.setColor(Color.white);
        G.fillRect(0, 0, 800, 40);   
   
        G.setColor(Color.black);
        G.drawString("Now "+sensor.num+"℃", 50, 35);
       
        G.drawString("Max. "+tMax+"℃",300, 35);
       
        G.drawString("Min. "+tMin+"℃",550, 35);

        G.setColor(Color.blue);
        G.fillOval(newp.x, newp.y, 3, 3);
   
        g.drawImage(bi,0,0,null); //それを画面に描画する

    }

    public static void main(String[] args){
        Plotting plt;

        JFrame frame = new JFrame("TempLan 35");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add(plt = new Plotting(new Point(49, 300)));

        frame.setSize(800, 600);
        frame.setVisible(true);

        plt.doPlot();
        }
    }


/* センサー */
class Sensor{
    String xport_ip = Plotting.xport_ip;
    int port = 10001;
    Socket xport_socket;
    BufferedReader socketin;
   
    String buff;
    double num;

    public Sensor(){
       
        try
        {
                xport_socket = new Socket(xport_ip, port);
                socketin = new BufferedReader(new InputStreamReader(xport_socket.getInputStream()));
        }
        catch(IOException e){}       
    }

    public double readData(){

        try
        {
            buff = socketin.readLine();
            num = Double.parseDouble(buff);
        }
        catch(IOException e){
            num = 0.0;
        }

        return num;
   }
}


注意事項
General disclaimer
トッ プページへ
なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで