こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Java 他クラスの呼び出しが上手くいきません。

Java初心者です。
過去Q&Aとして掲載されていた「iアプリでのクラスファイルが複数ある時の画面遷移」と同趣旨のことがしたく、記事を参考にプログラムを組んでみました。
しかし、コンパイルの際、画面遷移のための別クラスファイルを呼び出しインスタンス化するところで生じる「シンボルを見つけられません。」というエラーの原因がつかめず困っています。
作成したプログラムのどこがいけないのか、ご教示いただければ幸いです。

作成したプログラム
=========
Test01.java
=========
import com.nttdocomo.ui.*;

public class Test01 extends IApplication implements ComponentListener{
Button btn1;
Label lbl1;
public void start() {
Panel p1 = new Panel();
p1.setTitle("p1");
Label lbl1=new Label("p1に居ます。");
p1.add(lbl1);
Button btn1=new Button("next");
p1.add(btn1);
p1.setComponentListener(this);
Display.setCurrent(p1);
}
public void componentAction(Component source, int type, int param) {
if(type == ComponentListener.BUTTON_PRESSED) {
if(source==btn1){
Test02 test02 =new Test02(); //ここでエラーが発生します。
Display.setCurrent(test02);
lbl1.setText("p2に遷移");
}
}
}

}

============
Test02.java
============
import com.nttdocomo.ui.*;

public class Test02 extends IApplication implements ComponentListener{
Button btn1;
Label lbl1;
public void start() {
Panel p2 = new Panel();
p2.setTitle("p2");
Label lbl1=new Label("p2に居ます。");
p2.add(lbl1);
Button btn1=new Button("next");
p2.add(btn1);
p2.setComponentListener(this);
Display.setCurrent(p2);
}
public void componentAction(Component source, int type, int param) {
if(type == ComponentListener.BUTTON_PRESSED) {
if(source==btn1){
lbl1.setText("p1に遷移"); //コンパイルエラーは生じませんが、ラベル表示の切り替えができません。
}
}
}

}

投稿日時 - 2013-02-09 14:36:58

QNo.7936209

困ってます

質問者が選んだベストアンサー

「シンボルを見つけられません。」でコンパイルできないのは、
Test01クラスからTest02クラスを見つけられないことが原因かと思われます。

No.1様は
==
Test01とTest02は同じパッケージですか?
違うのであればTest01にimport xxxx.Test02;を記述する必要がある
==
とおっしゃってるように思います。


原因がご理解できないようでしたら
まずはJavaの勉強をしたほうがよろしいかと思います。

投稿日時 - 2013-02-16 23:56:16

お礼

planet_9_9様
ご回答ありがとうございました。
ご指摘のように「パッケージ」の意味がよく分かっていませんでした。
ソースファイルに対してパッケージを作成していませんので、Test01.java 、Test02.java、共に「デフォルトパッケージ」に属する状態にありました。
ともかく、
Test02.javaをパネルクラスのファイルに改め、二つ存在していたソースファイルをTest01.java一つに統一するようにプログラムを書き換えた後で、ファイルTest02.javaを、Test01.javaのsrcホルダーに一緒にしたところ、つまり二つのファイルを同一のパッケージに含めたところ、コンパイルに成功しました。
以下が書き換えたプログラムです。

=====
Test01.java
=====
import com.nttdocomo.ui.*;

class p1 extends Panel implements ComponentListener{
Test01 parent;
Label lbl1=new Label("p1に居ます。");
Button btn1=new Button("next");
p1(Test01 pparent){
parent = pparent;
setTitle("p1");
add(lbl1);
add(btn1);
setComponentListener(this);
Display.setCurrent(this);
}

public void componentAction(Component source, int type, int param) {
if(type == ComponentListener.BUTTON_PRESSED) {
if(source==btn1){
Test02 test02=new Test02();
Display.setCurrent(test02);
lbl1.setText("p2に遷移");
}
}
}

}
public class Test01 extends IApplication{
public void start() {
p1 pp01=new p1(this);
}
}


=====
Test02.java
=====

import com.nttdocomo.ui.*;

public class Test02 extends Panel implements ComponentListener{
Label lbl1=new Label("p2に居ます。");
Button btn1=new Button("next");
Test02(){
setTitle("p2");
add(lbl1);
add(btn1);
setComponentListener(this);
Display.setCurrent(this);
}
public void componentAction(Component source, int type, int param) {
if(type == ComponentListener.BUTTON_PRESSED) {
if(source==btn1){
lbl1.setText("p1に遷移");
}
}
}

}


別ファイルのクラスを利用したい場合、利用しようと思うクラスは全て同一のパッケージ属していなければならないという風に理解したのですが、私の理解は正しいでしょうか。
では、修正前のファイルTest02.javaが、 Public宣言されていたにもかかわらず、コンパイルエラーが出たのは何故なのでしょうか。
Publicで宣言するとは、パッケージの異同に関係なくアクセス可能であることを必ずしも意味しない、ということでしょうか。
また、ファイルTest01.javaの、Test02呼び出し部分を消去し、componentActionメソッド内の記述を、単にラベル表示のみに留めて、コンパイルしたところ、エラーこそ生じないものの、実行に際しては、ボタンクリックしてもラベル表示の切り替えができないという不可解な現象に見舞われました。
そこで、あるサイトのサンプルを参考に、ファイルTest01をパネルクラスの継承クラスを作成する仕方で書き換えたところ、今度はラベルの表示の切り替えに成功しました。
パネル型の変数を宣言して初期値をセットしてゆく最初のやり方では、リスナーが正常に機能せず、パネルクラスの継承クラスを作成する仕方ではこれが成功したのは何故なのか、疑問が残ります。
ですが、ともかく、別クラスファイルの呼び出しの問題点がパッケージ作成にあったことに気づいたときは、目から鱗の落ちるような思いでした。
意図している動作を実行するプログラムが作成できましたこと、感謝いたします。
ご指摘にもありましたように、上記の課題も含めて、これからjavaをもっとじっくり勉強したいと思います。

投稿日時 - 2013-02-19 11:26:10

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

パッケージ名は揃っておりますでしょうか?
揃っていない場合は、importを追加するか、揃えなければいけません。

投稿日時 - 2013-02-09 14:59:25

補足

ご回答ありがとうございます。

「パッケージ名が揃っているか?」というご指摘なのですが、
importの指定はサイトの作成例を見てそのまま記述しました。

パネルにボタンとラベルを組み込み、コンポーネントリスナーの機能を実装するだけなのですが、

mport com.nttdocomo.ui.*;

と記述するだけでは、まだ他に足りないものがあるのでしょうか。

作成した二つのクラスファイルの内、Test02.javaの方は、上記のimport指定でもエラーが出ていませんし、
問題のあるクラスファイル(Test01.java)についても、構成はTest02.javaと同じなので、importの指定に問題があるとは思われないのですが。

投稿日時 - 2013-02-10 00:07:16

あなたにオススメの質問