その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; } } |
ご意見/苦情/ご感想はこちらまで |