電子書籍の厳選無料作品が豊富!

RS-232Cのシリアル通信により受信したデータをもとに
appletに図を描写するプログラムを考えています。
まず受信したデータをコマンドプロンプトに出力することはできたのですがプログラムを改良して
受信データを用いてappletに図を描こうとしたところ
コンパイルはできたのですがappletで実行すると
コマンドプロンプトにエラーメッセージが表示され実行できませんでした。
プログラムは以下の通りです。
分かる方がおられたらご回答のほどよろしくお願いします。

import javax.comm.*;
import java.io.*;
import java.util.*;
import java.applet.Applet;
import java.awt.*;

public class SerialPortReader extends Applet implements SerialPortEventListener {

protected SerialPort port;
private InputStream is;
public int newData;

public void init(){
String portName = "COM6";
CommPortIdentifier portID = null;
try{
// COM6 のCommPortIdentifier を取得
portID = CommPortIdentifier.getPortIdentifier(portName);
}catch(NoSuchPortException ex){
ex.printStackTrace();
System.exit(1);
}

try{
//ポートのオープン
port = (SerialPort)portID.open("SerialPortWriter", 5000);
}catch(PortInUseException ex){
ex.printStackTrace();
System.exit(1);
}

try {
// 通信速度などの通信条件の設定
port.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN
| SerialPort.FLOWCONTROL_RTSCTS_OUT);
} catch (UnsupportedCommOperationException ex){
ex.printStackTrace();
System.exit(1);
}

try {
// SerialPortEvent を受け取るためのリスナの登録
port.addEventListener(this);
} catch(TooManyListenersException ex){
ex.printStackTrace();
System.exit(1);
}

// Data Available イベントを受け取るようにする
port.notifyOnDataAvailable(true);

try {
//COM6ポートから入力ストリームを取得する
is = port.getInputStream();
} catch (IOException ex){
ex.printStackTrace();
System.exit(1);
}
}

//受信データの大きさの円を描く
public void paint(Graphics g) {
g.fillOval(50, 50 , newData , newData);
}


// SerialPortEvent 処理ルーチン
public void serialEvent(SerialPortEvent event) {
newData = 0;

switch(event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
// Data Available 以外のイベントは処理しない
break;
case SerialPortEvent.DATA_AVAILABLE:

while (newData != -1) {
try {
//入力ストリームから次のバイトデータを読み込む
newData = is.read();
//十進数のアスキーコードから0~9の整数に変換
newData = newData - 48;

//受信データを元にグラフ表示
repaint();
//入力ストリームからバイトデータがなくなったら処理を終える
if (newData == -1) {
break;
}

} catch (IOException ex) {
System.err.println(ex);
return;
}
}
break;
}
}


}

A 回答 (3件)

java.security.SecureClassLoaderのエラーのようなので、このアプレットに下のようなmain()を付けてローカルアプリケーションとして動かしてみて動けば、無署名アプレットはセキュリティ上の理由により、クライアントのシリアルポートにアクセスできないという結論になるでしょう。

すでに、ローカルアプリケーションとしては動かして見られたのかな?
-------------------------------------------------
public static void main(String[] args){
SerialPortReader spr = new SerialPortReader();

Frame frame = new Frame();
frame.setSize(600, 600);

frame.add(spr);
frame.setVisible(true);
spr.init();
}
-----------------------------------------------
    • good
    • 0
この回答へのお礼

何度もご回答いただきありがとうございます。
教えていただいたmain文を追加したところアプリケーションにて
実行することができました。
本当にありがとうございました!

お礼日時:2008/01/25 16:44

そ、そ、そ、それとも、アプレットを動かしているクライアントのJavaに、javax.commがない?

    • good
    • 0

> エラーメッセージが表示され実行できませんでした


どんなエラーメッセージですか?。それがいちばん重要な診断情報です。
メッセージの全文、そしてソースの行番号などを示していたら、それがどの行かも教えてください。

この回答への補足

ご回答ありがとうございます。
説明が不足していて申し訳ありませんでした。
表示されたメッセージは以下の通りです。
よろしくお願いします。

at java.lang.NoClassDefFoundError: javax/comm/SerialPortEventListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:178)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:127)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at sun.applet.AppletClassLoader.loadCode(AppletPanel.java:618)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:780)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:709)
at sun.applet.AppletPanel.run(AppletPanel.java:363)
at java.lang.Thread.run(Thread.java:619)

補足日時:2008/01/25 12:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!