- PR -

アプレットでの描画ができません

投稿者投稿内容
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-01-21 11:41
Java初心者のS.Yと申します。
アプレットでのグラフ描画(正弦波)をするべくソースコードを作成し、
コンパイル、実行をしたのですが、グラフが正しく出力されません。

具体的には、以下の2ファイルを作成・保存し、
"javac Sinecurve.java"を実行し、コンパイルは通りました。
しかし、"appletviewer Sinecurve.html"を実行しても、
X軸、Y軸が表示されるだけで肝心の波形が出力されません。
どなたか御教示いただけないでしょうか?


// javaファイル名 : Sinecurve.java

import java.io.*;
import java.applet.Applet;
import java.awt.Graphics;

public class Sinecurve extends Applet
{
double i_1[];
double i_5[];
double chojo_1_5[];
double filter[];

int i_1_100[];
int i_5_100[];
int chojo_1_5_100[];
int filter_100[];

public void main(String args[])
{
i_1 = new double[193];
i_5 = new double[193];
chojo_1_5 = new double[193];
filter = new double[193];

i_1_100 = new int[193];
i_5_100 = new int[193];
chojo_1_5_100 = new int[193];
filter_100 = new int[193];

for(int n=0; n<193; n++){
i_1[n] = Math.sin(1*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときのsin値は " + i_1[n] + " です。");
i_1_100[n] = (int) (i_1[n]*100);
}

for(int n=0; n<193; n++){
i_5[n] = Math.sin(5*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときの5倍波は " + i_5[n] + " です。");
i_5_100[n] = (int) (i_5[n]*100);
}

for(int n=0; n<193; n++){
chojo_1_5[n] = i_1[n] + i_5[n];
System.out.println("サンプリング点 " + n + " のときの重畳波は " + chojo_1_5[n] + " です。");
chojo_1_5_100[n] = (int) (chojo_1_5[n]*100);
}

for(int n=88; n<193; n++){
filter[n] = (chojo_1_5[n]+2.75*chojo_1_5[n-8]+3.75*chojo_1_5[n-16]+3.75*chojo_1_5[n-24]
+2.75*chojo_1_5[n-32]+chojo_1_5[n-40]-chojo_1_5[n-48]-2.75*chojo_1_5[n-56]
-3.75*chojo_1_5[n-64]-3.75*chojo_1_5[n-72]-2.75*chojo_1_5[n-80]-chojo_1_5[n-88])*703/16384;
System.out.println("サンプリング点 " + n + " のときの重畳波(フィルタ有り)は " + filter[n] + " です。");
filter_100[n] = (int) (filter[n]*100);
}
}

public void paint(Graphics g){
g.drawLine(10,10,10,210);
g.drawLine(10,110,210,110);

for(int n=0; n<193; n++){
g.drawOval(n+10,-i_1_100[n]+110,1,1);
g.drawOval(n+10,-i_5_100[n]+110,1,1);
g.drawOval(n+10,-chojo_1_5_100[n]+110,1,1);
g.drawOval(n+10,-filter_100[n]+110,1,1);
}
}
}


// htmlファイル名 : Sinecurve.html

<HTML>
<BODY>
<APPLET CODE ="Sinecurve.class" WIDTH = 220 HEIGHT = 220>
</APPLET>
</BODY>
</HTML>

_________________
かしん
常連さん
会議室デビュー日: 2004/08/27
投稿数: 25
お住まい・勤務地: 窓際
投稿日時: 2005-01-21 12:06
public static void main(String[] args)



public void init()

に変更すれば、表示されます。

アプレットではメインは呼び出してもらえません。
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-01-21 13:17
変更したら波形が表示されました!
かしんさん、どうもありがとうございます。

アプレットではメインを呼び出せないんですか。
知りませんでした。
重ね重ね、ありがとうございます。
_________________
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-02-02 11:19
かしんさん、その節はどうもありがとうございます。

さて、出来上がったプログラムを改造し、
アプレット上のボタンを押したときに波形が出力されるようにしようとしたのですが、
うまくいきません。

アプレット起動→X軸、Y軸描画→出力開始ボタン入力→グラフ描画

という流れでソースコードを作成したのですが、コンパイルが通りません。

「式の開始が不正です」だから、{}の対応関係が原因なのではないかと考え、
{}の数、対応関係を確認したのですが、間違った箇所が見当たらず、
調べても結局原因がつかめませんでした。
使用しているコンパイラはj2sdk1.4.2_04です。

どなたか御教示いただけないでしょうか?


// javaファイル名 : Sinecurve_11.java

import java.io.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Button;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Sinecurve_11 extends Applet implements ActionListener
{
double i_1[];
double i_5[];
double chojo_1_5[];
double filter[];

int i_1_100[];
int i_5_100[];
int chojo_1_5_100[];
int filter_100[];

public void init()
{
i_1 = new double[193];
i_5 = new double[193];
chojo_1_5 = new double[193];
filter = new double[193];

i_1_100 = new int[193];
i_5_100 = new int[193];
chojo_1_5_100 = new int[193];
filter_100 = new int[193];

for(int n=0; n<193; n++)
{
i_1[n] = Math.sin(1*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときのsin値は " + i_1[n] + " です。");
i_1_100[n] = (int) (i_1[n]*100);
}

for(int n=0; n<193; n++)
{
i_5[n] = Math.sin(5*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときの5倍波は " + i_5[n] + " です。");
i_5_100[n] = (int) (i_5[n]*100);
}

for(int n=0; n<193; n++)
{
chojo_1_5[n] = i_1[n] + i_5[n];
System.out.println("サンプリング点 " + n + " のときの重畳波は " + chojo_1_5[n] + " です。");
chojo_1_5_100[n] = (int) (chojo_1_5[n]*100);
}

for(int n=88; n<193; n++)
{
filter[n] = (chojo_1_5[n]+2.75*chojo_1_5[n-8]+3.75*chojo_1_5[n-16]+3.75*chojo_1_5[n-24]
+2.75*chojo_1_5[n-32]+chojo_1_5[n-40]-chojo_1_5[n-48]-2.75*chojo_1_5[n-56]
-3.75*chojo_1_5[n-64]-3.75*chojo_1_5[n-72]-2.75*chojo_1_5[n-80]-chojo_1_5[n-88])*703/16384;
System.out.println("サンプリング点 " + n + " のときの重畳波(フィルタ有り)は " + filter[n] + " です。");
filter_100[n] = (int) (filter[n]*100);
}
}

public void paint(Graphics g)
{
g.drawLine(30,20,30,420);
g.drawLine(30,220,430,220);

g.drawString(" 2",20, 20);
g.drawString(" 1",20,120);
g.drawString(" 0",20,220);
g.drawString("-1",20,320);
g.drawString("-2",20,420);
g.drawString("Sample",380,230);

Button bt;

public void init()
{
bt = new Button("出力開始");
add(bt);
bt.addActionListener(this);
}

public void actionPerformed(ActionEvent ae)
{
for(int n=1; n<193; n++)
{
g.setColor(Color.red);
g.drawLine(n*2+30,-i_1_100[n-1]+220,n*2+32,-i_1_100[n]+220);
g.setColor(Color.blue);
g.drawLine(n*2+30,-i_5_100[n-1]+220,n*2+32,-i_5_100[n]+220);
g.setColor(Color.magenta);
g.drawLine(n*2+30,-chojo_1_5_100[n-1]+220,n*2+32,-chojo_1_5_100[n]+220);

if(n>89)
{
g.setColor(Color.green);
g.drawLine(n*2+30,-filter_100[n-1]+220,n*2+32,-filter_100[n]+220);
}

try
{
Thread.sleep(100);
}

catch(Exception e)
{
}
}
}
}
}


// htmlファイル名 : Sinecurve_11.html

<HTML>
<HEAD>
<TITLE>Sinecurve_11
</TITLE>
</HEAD>
<BODY>
<APPLET CODE ="Sinecurve_11.class" WIDTH = 440 HEIGHT = 440>
</APPLET>
</BODY>
</HTML>


// エラーメッセージ

C:\YJSample\04>javac Sinecurve_11.java
Sinecurve_11.java:78: 式の開始が不正です。
public void init()
^
Sinecurve_11.java:112: ';' がありません。
}
^
エラー 2 個

_________________
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2005-02-02 11:37
明らかに、paint(Graphics g)メソッドの } が 閉じてないように見えますが。。。コピーし間違い?

code Bコードを使ってもらえると、コードが分かりやすくていいですよ。
コード:
public void paint(Graphics g)
{
  g.drawLine(30,20,30,420);
  g.drawLine(30,220,430,220);

  g.drawString(" 2",20, 20);
  g.drawString(" 1",20,120);
  g.drawString(" 0",20,220);
  g.drawString("-1",20,320);
  g.drawString("-2",20,420);
  g.drawString("Sample",380,230);
} // <-- これがいるんじゃない?

Button bt;

パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-02-02 12:00
はじめましてパテ太と申します。

添付されているソースコードでは

paintのメソッド定義 {
initのメソッド定義 { }
actionPerformedのメソッド定義 { }
}
という風になっています。
※メソッドの中に別のメソッドの定義が含まれています。

たぶんS.Yさんの意図している内容とは異なっていると思いますので
エラーの直接の原因のみ申し上げますと

「Javaではメソッド定義の中で別のメソッド定義はできません。
(メソッドのネストはできません。)」

ということです。



蛇足ですが、メソッドの中でクラスを定義することはできます。
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-02-02 13:51
H2さん、パテ太さん、ありがとうございます。
お手数かけましてすみません。
メソッドの中にメソッドを入れ子にすることができないとは知らずに、
ずっとエラーの原因について考えていたので助かりました。
S.Y
会議室デビュー日: 2004/10/08
投稿数: 8
投稿日時: 2005-02-07 11:39
パテ太さん、ありがとうございます。

パテ太さんの、
「メソッド内にメソッドを定義できないが、メソッド内にクラスの定義ならできる」
というアドバイスのとおりに、クラスの定義によってプログラムを実行させようとしました。

前回と同じく、アプレット起動→X軸、Y軸描画→出力開始ボタン入力→グラフ描画
という流れです。

しかし、アプレット起動→X軸、Y軸描画、出力開始ボタン表示まではうまくいくのですが、
出力開始ボタンを押しても波形は表示されません。
クラス継承の仕方に問題があると思い、クラス周りの記述などを調べても
原因がわからず、再び投稿させていただきました。

何度もすみませんがどなたか御教示いただけないでしょうか?


// javaファイル名 : Sinecurve_16.java


import java.applet.Applet;
import java.awt.*;
import java.io.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Color;
import java.awt.Button;
import java.awt.Graphics;


class Sinecurve_16_draw
{
public void paint(Graphics g)
{
double i_1[];
double i_5[];
double chojo_1_5[];
double filter[];

int i_1_100[];
int i_5_100[];
int chojo_1_5_100[];
int filter_100[];

i_1 = new double[193];
i_5 = new double[193];
chojo_1_5 = new double[193];
filter = new double[193];

i_1_100 = new int[193];
i_5_100 = new int[193];
chojo_1_5_100 = new int[193];
filter_100 = new int[193];

for(int n=0; n<193; n++){
i_1[n] = Math.sin(1*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときのsin値は " + i_1[n] + " です。");
i_1_100[n] = (int) (i_1[n]*100);
}

for(int n=0; n<193; n++){
i_5[n] = Math.sin(5*2*3.1415926535897932*n/96);
System.out.println("サンプリング点 " + n + " のときの5倍波は " + i_5[n] + " です。");
i_5_100[n] = (int) (i_5[n]*100);
}

for(int n=0; n<193; n++){
chojo_1_5[n] = i_1[n] + i_5[n];
System.out.println("サンプリング点 " + n + " のときの重畳波は " + chojo_1_5[n] + " です。");
chojo_1_5_100[n] = (int) (chojo_1_5[n]*100);
}

for(int n=88; n<193; n++){
filter[n] = (chojo_1_5[n]+2.75*chojo_1_5[n-8]+3.75*chojo_1_5[n-16]+3.75*chojo_1_5[n-24]
+2.75*chojo_1_5[n-32]+chojo_1_5[n-40]-chojo_1_5[n-48]-2.75*chojo_1_5[n-56]
-3.75*chojo_1_5[n-64]-3.75*chojo_1_5[n-72]-2.75*chojo_1_5[n-80]-chojo_1_5[n-88])*703/16384;
System.out.println("サンプリング点 " + n + " のときの重畳波(フィルタ有り)は " + filter[n] + " です。");
filter_100[n] = (int) (filter[n]*100);
}

for(int n=1; n<193; n++){
g.setColor(Color.red);
g.drawLine(n*2+30,-i_1_100[n-1]+220,n*2+32,-i_1_100[n]+220);
g.setColor(Color.blue);
g.drawLine(n*2+30,-i_5_100[n-1]+220,n*2+32,-i_5_100[n]+220);
g.setColor(Color.magenta);
g.drawLine(n*2+30,-chojo_1_5_100[n-1]+220,n*2+32,-chojo_1_5_100[n]+220);

if(n>89){
g.setColor(Color.green);
g.drawLine(n*2+30,-filter_100[n-1]+220,n*2+32,-filter_100[n]+220);
}

try{
Thread.sleep(100);
}catch(Exception e){
}
}
}
}


class Sinecurve_16_end extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0); }
}


public class Sinecurve_16 extends Applet implements ActionListener
{
public void paint(Graphics g)
{
g.drawLine(30,20,30,420);
g.drawLine(30,220,430,220);

g.drawString(" 2",20, 20);
g.drawString(" 1",20,120);
g.drawString(" 0",20,220);
g.drawString("-1",20,320);
g.drawString("-2",20,420);
g.drawString("Sample",380,230);
}

Button bt;

public void init()
{
bt = new Button("出力開始");
add(bt);
bt.addActionListener(this);
}

public void actionPerformed(ActionEvent ae)
{
Sinecurve_16_draw sd = new Sinecurve_16_draw();
}

Sinecurve_16_end se = new Sinecurve_16_end();
}



// htmlファイル名 : Sinecurve_16.html

<HTML>
<HEAD>
<TITLE>Sinecurve_16
</TITLE>
</HEAD>
<BODY>
<APPLET CODE ="Sinecurve_16.class" WIDTH = 440 HEIGHT = 440>
</APPLET>
</BODY>
</HTML>

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