
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に遷移"); //コンパイルエラーは生じませんが、ラベル表示の切り替えができません。
}
}
}
}
No.2ベストアンサー
- 回答日時:
「シンボルを見つけられません。
」でコンパイルできないのは、Test01クラスからTest02クラスを見つけられないことが原因かと思われます。
No.1様は
==
Test01とTest02は同じパッケージですか?
違うのであればTest01にimport xxxx.Test02;を記述する必要がある
==
とおっしゃってるように思います。
原因がご理解できないようでしたら
まずはJavaの勉強をしたほうがよろしいかと思います。
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をもっとじっくり勉強したいと思います。
No.1
- 回答日時:
パッケージ名は揃っておりますでしょうか?
揃っていない場合は、importを追加するか、揃えなければいけません。
この回答への補足
ご回答ありがとうございます。
「パッケージ名が揃っているか?」というご指摘なのですが、
importの指定はサイトの作成例を見てそのまま記述しました。
パネルにボタンとラベルを組み込み、コンポーネントリスナーの機能を実装するだけなのですが、
mport com.nttdocomo.ui.*;
と記述するだけでは、まだ他に足りないものがあるのでしょうか。
作成した二つのクラスファイルの内、Test02.javaの方は、上記のimport指定でもエラーが出ていませんし、
問題のあるクラスファイル(Test01.java)についても、構成はTest02.javaと同じなので、importの指定に問題があるとは思われないのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Java java final 1 2022/06/10 22:49
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Swingで印刷
-
SortedSetならぬSortedListの良...
-
「Util.Timer」を使って車輪が...
-
落下する正方形を左右に移動す...
-
Java 他クラスの呼び出しが上手...
-
struts2のchainで値の受け渡し...
-
決められて時間が経過するとア...
-
長方形を描いて、それを移動さ...
-
JavaFXでの表内のチェックボッ...
-
C# visibleプロパティをfalseに...
-
C#でキーイベントが発生しない...
-
C#でのWNetAddConnection3の使...
-
setIcon() の反対のようなもの...
-
エンターキーを押すとOKボタン...
-
リストボックスの選択項目をさ...
-
Thread.sleepのInterruptedExce...
-
Graphicsクラスを使って描画履...
-
swing初心者です
-
JPanel上のマウスの座標の取得
-
JScrollPaneで、表示がおかしく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
C# visibleプロパティをfalseに...
-
C#でのWNetAddConnection3の使...
-
C# DataGridView列カスタマイズ
-
C# MouseHoverを何度も呼ぶには
-
C#でキーイベントが発生しない...
-
Junitテストでvoid戻り値メッソ...
-
C# WinForm のDataGridView Cel...
-
ボタンの複数割り当てについて
-
ユーザーコントロールを動的に...
-
ボタンのイベントで異なるウィ...
-
LVM_SETITEMSTATEでListViewの...
-
c# スレッド間でのデータの共有
-
C#,listBoxのItem追加について...
-
unityでのC++エラーの原因がわ...
-
C# 矢印キーの取得
-
JavaFXでの表内のチェックボッ...
-
C# 半角カナの文字化けについて
-
C#で別のFormへ複数の値を返そ...
おすすめ情報