Java初心者がクラスの呼び出しでエラーに困っています

このQ&Aのポイント
  • Java初心者がTest01とTest02という2つのクラスを作成し、画面遷移のプログラムを作成しています。しかし、Test01クラス内でTest02クラスを呼び出す箇所でエラーが発生しています。
  • 作成したプログラムでは、Test01クラスとTest02クラスがIApplicationクラスを継承しており、画面遷移を行うためのボタンを配置しています。しかし、Test01クラスからTest02クラスをインスタンス化する箇所で「シンボルを見つけられません。」というエラーが表示されています。
  • どこが間違っているのかわからず、解決策を教えていただきたいです。
回答を見る
  • ベストアンサー

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に遷移"); //コンパイルエラーは生じませんが、ラベル表示の切り替えができません。 } } } }

  • dig3
  • お礼率33% (2/6)
  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

「シンボルを見つけられません。」でコンパイルできないのは、 Test01クラスからTest02クラスを見つけられないことが原因かと思われます。 No.1様は == Test01とTest02は同じパッケージですか? 違うのであればTest01にimport xxxx.Test02;を記述する必要がある == とおっしゃってるように思います。 原因がご理解できないようでしたら まずはJavaの勉強をしたほうがよろしいかと思います。

dig3
質問者

お礼

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をもっとじっくり勉強したいと思います。

その他の回答 (1)

  • tavatar
  • ベストアンサー率37% (3/8)
回答No.1

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

dig3
質問者

補足

ご回答ありがとうございます。 「パッケージ名が揃っているか?」というご指摘なのですが、 importの指定はサイトの作成例を見てそのまま記述しました。 パネルにボタンとラベルを組み込み、コンポーネントリスナーの機能を実装するだけなのですが、 mport com.nttdocomo.ui.*; と記述するだけでは、まだ他に足りないものがあるのでしょうか。 作成した二つのクラスファイルの内、Test02.javaの方は、上記のimport指定でもエラーが出ていませんし、 問題のあるクラスファイル(Test01.java)についても、構成はTest02.javaと同じなので、importの指定に問題があるとは思われないのですが。

関連するQ&A

  • iアプリ パネル遷移の際の変数の受け渡し方について

    iアプリで、パネル遷移の際に遷移元の変数を遷移先に引き渡したいのですが、その方法がわかりません。 テスト用のプログラムを作成しましたので、どなたかご教示いただければ幸いです。 ソフトキー1:終了 ソフトキー2:TextBoxのリセット ボタン:パネル遷移とTextBoxの入力文字の遷移先への引き渡し TextBox:受納したテキストの表示と送付用のテキストの入力 以上の機能をパネル'p1'と'p2'とに備え、二つのパネル間での遷移とテキストの受け渡しをしたいと思います。 ========== Test.java ========== public class testx extends IApplication { public void start() { P1 p1 = new P1(); P2 p2 = new P2(); Display.setCurrent(p1); } } ======== P1.java ======== public class P1 extends Panel implements ComponentListener, SoftKeyListener{ IApplication iapp; String str =""; Button btn1 = new Button("送る"); TextBox tb1=new TextBox("",33,1,TextBox.DISPLAY_ANY); P1(){ setTitle("P1"); HTMLLayout lm=new HTMLLayout(); setLayoutManager(lm); lm.begin(HTMLLayout.LEFT); add(tb1); add(btn1); lm.end(); setSoftKeyListener(this); setSoftLabel(SOFT_KEY_1,"終了"); setSoftLabel(SOFT_KEY_2,"リセット"); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source,int type,int param){ if(type==BUTTON_PRESSED){ /* p2 からのテキストをstrと定義しTextBoxに表示したい。 その定義の仕方がわからない。 str = ; */ tb1.setText(str); /* TextBoxに新たに入力した文字列をstrと再定義。 変数strをp2に渡したい。 */ str = tb1.getText(); P2 p2 = new P2(); Display.setCurrent(p2); } } public void softKeyPressed(int softKey){ if(softKey==SOFT_KEY_1){ iapp.terminate(); } if(softKey==SOFT_KEY_2){ tb1.setText(""); } } public void softKeyReleased(int softKey){ } } ======== P2.java ======== public class P2 extends Panel implements ComponentListener, SoftKeyListener{ IApplication iapp; String str =""; Button btn1 = new Button("送る"); TextBox tb1=new TextBox("",33,1,TextBox.DISPLAY_ANY); P2(){ setTitle("P2"); HTMLLayout lm=new HTMLLayout(); setLayoutManager(lm); lm.begin(HTMLLayout.LEFT); add(tb1); add(btn1); lm.end(); setSoftKeyListener(this); setSoftLabel(SOFT_KEY_1,"終了"); setSoftLabel(SOFT_KEY_2,"リセット"); setComponentListener(this); Display.setCurrent(this); } public void componentAction(Component source,int type,int param){ if(type==BUTTON_PRESSED){ /* p1 からのテキストをstrと定義しTextBoxに表示したい。 その定義の仕方がわからない。 str = ; */ tb1.setText(str); /* TextBoxに新たに入力した文字列をstrと再定義。 変数strをp1に渡したい。 */ str = tb1.getText(); P1 p1 = new P1(); Display.setCurrent(p1); } } public void softKeyPressed(int softKey){ if(softKey==SOFT_KEY_1){ iapp.terminate(); } if(softKey==SOFT_KEY_2){ tb1.setText(""); } } public void softKeyReleased(int softKey){ } }

  • javaでのiアプリの画面表示について

    javaでiアプリを作成したいのですが、行きずまっています。 テキストボックスとストップウォッチを画面上に両方表示させたいのですが、下のDisplay.setCurrent(p);とDisplay.setCurrent(mainWin);のどちらかしか表示されません。 ストップウォッチは、MainWin.javaが他にありますのでしっかり起動します。 どうすれば良いでしょうか? package stopwatch; import com.nttdocomo.ui.*; public class StopWatch extends IApplication implements ComponentListener { MainWindow mainWin; TextBox textbox1; TextBox textbox2; public void start() { Panel p = new Panel(); textbox1 = new TextBox("",16,2,TextBox.DISPLAY_ANY); p.add(textbox1); textbox2 = new TextBox("(未入力)",16,2, TextBox.DISPLAY_ANY); textbox2.setEditable(false); p.add(textbox2); p.setComponentListener(this); Display.setCurrent(p); mainWin = new MainWindow(); Display.setCurrent(mainWin); } public void componentAction(Component source , int type, int param) { if(type == ComponentListener.TEXT_CHANGED && source == textbox1) { textbox2.setText(textbox1.getText()); } } }

  • javaでのiアプリの画面表示について

    javaでiアプリを作成したいのですが、行きずまっています。 テキストボックスとストップウォッチを画面上に両方表示させたいのですが、下のDisplay.setCurrent(p);とDisplay.setCurrent(mainWin);のどちらかしか表示されません。 ストップウォッチは、MainWin.javaが他にありますのでしっかり起動します。 どうすれば良いでしょうか? package stopwatch; import com.nttdocomo.ui.*; public class StopWatch extends IApplication implements ComponentListener { MainWindow mainWin; TextBox textbox1; TextBox textbox2; public void start() { Panel p = new Panel(); textbox1 = new TextBox("",16,2,TextBox.DISPLAY_ANY); p.add(textbox1); textbox2 = new TextBox("(未入力)",16,2, TextBox.DISPLAY_ANY); textbox2.setEditable(false); p.add(textbox2); p.setComponentListener(this); Display.setCurrent(p); mainWin = new MainWindow(); Display.setCurrent(mainWin); } public void componentAction(Component source , int type, int param) { if(type == ComponentListener.TEXT_CHANGED && source == textbox1) { textbox2.setText(textbox1.getText()); } } }

  • iアプリ 複数パネル切替時の変数受渡(再度)

    すみませんが、再度質問です。 パネルを切替えると、変数が書換えられてません。 import com.nttdocomo.ui.*; public class TEST01 extends IApplication { MainCanvas mc; MainPanel mp; public void start() { mc = new MainCanvas(); mp = new MainPanel(); Display.setCurrent(mc); } } class MainCanvas extends Canvas{ TEST01 app; int data; public MainCanvas() { data=1; //----- data=1 Graphics g=getGraphics(); app = (TEST01)IApplication.getCurrentApp(); } public void paint(Graphics g) { data=2; // ここでdataを書換えてるのに・・・・ g.drawString("data="+data,100,100); g.drawString("セレクトキーで画面切替",50,200); } public void processEvent(int type, int param) { if (type == Display.KEY_PRESSED_EVENT) { if (param == Display.KEY_SOFT2) { IApplication.getCurrentApp().terminate(); } if (param == Display.KEY_SELECT) { Display.setCurrent(app.mp); } } } } class MainPanel extends Panel implements ComponentListener{ TEST01 app; Button b1; Label l1; public MainPanel() { app=(TEST01)IApplication.getCurrentApp(); l1=new Label("data="+app.mc.data); //書換えたdata=2にならないのはなぜ? b1=new Button("Push me"); add(l1); add(b1); setComponentListener(this); } public void componentAction(Component c,int type, int param){ if (c == b1 && type == BUTTON_PRESSED) Display.setCurrent(((TEST01)IApplication.getCurrentApp()).mc); } } data=1だったのをdata=2にしたのに、1のままです。

    • ベストアンサー
    • Java
  • iアプリで複数の画面(パネル)を使いたいのですが。

    以下のコードを実行するとボタンとラベルが一緒の画面に表示されますが、ボタンを押した時に新しい画面(パネル)でラベルを表示したいのです。どのようにすれば良いのでしょうか? import com.nttdocomo.ui.*; import com.nttdocomo.io.*; public class test01 extends IApplication { public void start() { mypanel w_panel = new mypanel(); w_panel.setSoftLabel(w_panel.SOFT_KEY_1,"終了"); Display.setCurrent(w_panel); } class mypanel extends Panel implements SoftKeyListener { private Label w_label; private Button w_button; public mypanel(){ w_button = new Button("ボタン"); add(w_button); w_label = new Label("ラベル"); add(w_label); setSoftKeyListener(this); } public void softKeyReleased(int param){ if(param == this.SOFT_KEY_1){ terminate(); } } public void softKeyPressed(int param){ } } }

    • ベストアンサー
    • Java
  • javaのプログラムについて

    初めまして。java初心者のものです。 コンピュータとじゃんけんをするというプログラムをつくりたいのですが、 コンパイルしたところ、次のようなエラーが出ました。 「シンボルが見つかりません。」 どこをどう直せばよいのでしょうか。お教え願います。 以下が私のプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.AudioClip; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } } 大変恐縮ですが、よろしくお願いします。

  • java 初心者です。

    COMとじゃんけんをし、勝敗を決定するというプログラムを作りたいのですが、 コンパイルしたところ、33行目に「シンボルが見つけられません」というエラーが出ます。 (合計12個のエラーがでます) どこを直せばこのエラーは解決されるのでしょうか。 すいませんが、よろしくお願いします。 以下がプログラムです。 import java.awt.event.*; import java.awt.*; import javax.swing.*; class Zyanken extends YJFrame implements ActionListener{ JButton[] btn; JPanel panel; Zyanken(String s, int w, int h,int b){ super(s,w,h,b); String[] ttl={"グー","チョキ","パー","Exit"}; String[] tips={"グーです","チョキです","パーです","終了します"}; int i; setUp(); Icon[] ic=new Icon[4]; for(i=0;i<4;i++) ic[i]=new ImageIcon("icon"+i+".gif"); btn=new JButton[4]; for(i=0;i<4;i++){ btn[i]=new JButton(ttl[i],ic[i]); btn[i].setToolTipText(tips[i]); btn[i].addActionListener(this); } JPanel p=new JPanel(); for(i=0;i<4;i++) p.add(btn[i]); p.setBackground(Color.pink); pane.add(p,BorderLayout.SOUTH); panel=new JPanel(); pane.add(panel,BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ int com=(int)(Math.random()*4); if(com==1){ panel.setText("COMはグーです。"); } else if(com==2){ panel.setText("COMはチョキです。"); } else{ panel.setText("COMはパーです。"); } if(e.getSource()==btn){ if(com==1){ panel.setText("あいこです。"); } else if(com==2){ panel.setText("あなたの勝ちです。"); } else{ panel.setText("あなたの負けです。"); } } else if(e.getSource()==btn){ if(com==1){ panel.setText("あなたの負けです。"); } else if(com==2){ panel.setText("あいこです。"); } else{ panel.setText("あなたの勝ちです。"); } } else{ if(com==1){ panel.setText("あなたの勝ちです。"); } else if(com==2){ panel.setText("あなたの負けです。"); } else{ panel.setText("あいこです。"); } } } }

  • JAVAの知識が乏しい超初心者です。

    JAVAの知識が乏しい超初心者です。 自分なりにコードを書いてみたのですが、うまくいきません。 お見せするのも恥ずかしいのですが 以下のように作ってみました。 import javax.swing.*; import java.awt.*; import javax.swing.border.TitledBorder; class FileKanri2 extends JFrame{  public static void main(String args[]){   FileKanri2 frame = new FileKanri2("テスト");   frame.setVisible(true);  }  FileKanri2(String title){   setTitle(title);   setBounds(100, 100, 830, 820);   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   setLayout(new FlowLayout());   JPanel p = pSakusei("題名",210);   bSakusei(p, "ボタン0", "補足0",0);   bSakusei(p, "ボタン1", "補足1",1);   bSakusei(p, "ボタン2", "補足2",2);   bSakusei(p, "ボタン3", "補足3",3);   bSakusei(p, "ボタン4", "補足4",4);   bSakusei(p, "ボタン5", "補足5",5);   bSakusei(p, "ボタン6", "補足6",6);   bSakusei(p, "ボタン7", "補足7",7);  }  public JPanel pSakusei(String pTitle, int tateSize){   JPanel p = new JPanel();   p.setBorder(BorderFactory.createTitledBorder(pTitle));   add(p, BorderLayout.NORTH);   p.setPreferredSize(new Dimension(810, tateSize));   p.setBackground(Color.white);   return p;  }  public void bSakusei(JPanel p, String bName, String lName, int i){   int btnSizeH = 50;   int btnSizeW = 180;   SpringLayout layout = new SpringLayout();   p.setLayout(layout);   JButton btn = new JButton(bName);   btn.setPreferredSize(new Dimension(btnSizeW, btnSizeH));   layout.putConstraint(SpringLayout.NORTH, btn,(i/4)*80+10, SpringLayout.NORTH,   p);   layout.putConstraint(SpringLayout.WEST, btn,(i%4)*200+10, SpringLayout.WEST,   p);   p.add(btn);   JLabel lbl = new JLabel(lName);   layout.putConstraint(SpringLayout.NORTH, lbl, 5, SpringLayout.SOUTH, btn);   layout.putConstraint(SpringLayout.WEST, lbl, 10, SpringLayout.WEST, btn);   p.add(lbl);   Container contentPane = getContentPane();   contentPane.add(p);  } } パネルの上にボタンを配置するだけなのですが、 添付の画像のように、ボタンが希望通りに並んでくれません; (ボタンの数を変えると、最初と最後のボタンだけ表示され  なおかつ最後のボタンのみ希望の位置に行ってくれます。) どこがおかしいのかご指摘お願いいたします。。

    • ベストアンサー
    • Java
  • java アプレット

    学校の授業でアプレットを学んでいます。 しかし・・・ 下のプログラムで、計算した結果をlabel3にはりつけたいのですが、計算結果がでてくれません・・・ボタンを押しても何もでてきません。 コマンドプロンプトで、エラーはでてきません。 お手数ですが、誰かどこがいけないのか教えて下さい。 import java.awt.*; import java.awt.event.*; public class B extends java.applet.Applet implements ActionListener { Label label3 = new Label(); Button button2 = new Button(); TextField textfield1= new TextField(10); TextField textfield2= new TextField(10); public void init() { button2.setLabel("入力したらクリック!"); button2.setBounds(new Rectangle(50, 465, 120, 20)); this.setLayout(null); label3.setBackground(Color.blue); label3.setBounds(new Rectangle(325, 80, 200, 35)); textfield1.setBounds(100, 425, 100, 25); textfield2.setBounds(150, 350, 100, 25); this.add(textfield2, null); this.add(label3, null); this.add(textfield1, null); this.add(button2, null);} public void actionPerformed(ActionEvent event) {if(event.getSource() == button2) {int diff = Integer.parseInt(textfield1.getText()) - Integer.parseInt(textfield2.getText()); String otsuri; otsuri ="お釣りは"+ diff +"円です。"; label3.setText(otsuri);} }} よろしくお願いします。

    • ベストアンサー
    • Java
  • iアプリでの関数の計算について

    関数(トランク関数とアークタンジェント)を計算したいのですが、以下のコードだと「シンボルを解釈処理できません」とメッセージが出てコンパイルできません。何か間違っているのでしょうか。 import com.nttdocomo.ui.*; public class test01 extends IApplication { private Panel p1; private Label label1,label2; public void start() { p1 = new Panel(); double num1,num2; num1 = Math.atan2(1.0,1.0); num2 = Math.trunc(1.0); label1=new Label("計算結果A "+ num1); label2=new Label("計算結果B "+ num2); p1.add(label1); p1.add(label2); Display.setCurrent(p1); } }

    • ベストアンサー
    • Java

専門家に質問してみよう