• 締切済み

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){ } }

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

みんなの回答

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

値を受け渡し用のクラスを作って、それを通して渡せばよいのでは? class Value{ private String str; public void setString(String str){this.str=str;} public String getString(){return this.str;} } public void start() { P1 p1 = new P1(); P2 p2 = new P2(); Vaue v = new Value(); p1.setValue(v); p2.setValue(v); Display.setCurrent(p1); } で、componentActionメソッド内で、Valueのインスタンスから受け取れば良いと思います。 あと、componentActionメソッドでP1、P2をnewすると P1→P2→P1→P2とどんどんインスタンスを追加していくので、リソースを食うんじゃないかな。

dig3
質問者

補足

クラスValueをp1、p2にどのように適用してよいものか、わからなかったので、 P1.java、P2.javaはそのままにして、とりあえず、ご教示された通り、Valueクラスをつくり、Test.javaだけでも書き換えてコンパイルしてみました。 すると、Test.java中の、 p1.setValue(v); p2.setValue(v); について、 シンボル:メソッド setValue(Value) 「シンボルが見つかりません」というエラーがでました。 ========== Value.java ========== class Value{ private String str; public void setString(String str){ this.str=str; } public String getString(){ return this.str; } } ========== Test.java ========== public class testx extends IApplication { public void start() { P1 p1 = new P1(); P2 p2 = new P2(); Value v = new Value(); p1.setValue(v);// エラー p2.setValue(v);// エラー Display.setCurrent(p1); } } ご助言頂いたValueクラスなのですが、意図されていることが今ひとつよく理解できません。 String 型の変数strをオブジェクトとして生成するクラスで、この変数strには戻り値がそのまま適用される、という風にクラスValueを解釈してよければ、 p1(p2)で 新たに入力されたテキストを、このパネルp1(p2)の変数strとして新たに設定し直すというようなことが意図されているのでしょうか。 また、そのようなことを、エラーが出た記述、p1.setValue(v)、p2.setValue(v)は意味しているのでしょうか。 もし私の理解に誤りがあるなら、お詫びしなければなりませんが、 Valueをp1(p2)の変数strの再設定に使用したとしても、遷移した先のp2(p1)で変数strを参照するために、パネルクラスP1(P2)をインスタンス化した時点で、初期設定の空文字 の状態に戻ってしまうことにならないでしょうか。

関連するQ&A

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

    • ベストアンサー
    • 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
  • 一桁電卓(setText)

    //<applet code="Calc.class" width="250" height="150" ></applet> import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calc extends JApplet implements ActionListener{ JTextField display; int row=4,column=4,value=0,d; char str,str2; JButton[][] button=new JButton[row][column]; String[][] buttonName={{"7","8","9","/"}, {"4","5","6","*"}, {"1","2","3","-"}, {"0","C","=","+"}}; public void init(){ Container pane=getContentPane(); JPanel panel=new JPanel(); panel.setLayout(new GridLayout(4,4)); display=new JTextField(String.valueOf(value)); pane.add(display); display.setHorizontalAlignment(JTextField.RIGHT); display.setEditable(false); for(int a=0;a<row;a++){ for(int b=0;b<column;b++){ button[a][b]=new JButton(buttonName[a][b]); panel.add(button[a][b]); button[a][b].addActionListener(this); } } pane.add(panel,BorderLayout.SOUTH); } public void setText(int c){ if(str2!='/'&&str2!='*'&&str2!='-'&&str2!='+'){ value=c; } else if(str=='='){ display.setText(String.valueOf(value)); } if(str!='/'&&str!='*'&&str!='-'&&str!='+'&&str!='='){ display.setText(String.valueOf(c)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } else{ display.setText(String.valueOf(value)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } } public void actionPerformed(ActionEvent e){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(e.getSource()==button[i][j]){ str=buttonName[i][j].charAt(0); switch(str){ case '/': str2=str; setText(1); break; case '*': str2=str; setText(1); break; case '-': str2=str; setText(0); break; case '+': str2=str; setText(0); break; case '=': setText(d); break; case 'C': str2=str; value=0; setText(value); break; default: d=Integer.parseInt(buttonName[i][j]); setText(d); break; } } } } } } 上のプログラムは一桁電卓です。 プログラムは思ったように動くんですが、 seText(0、または1)の部分がどういう役目を果たしているか、0と1でどう違ってくるのかが分かりません。できればsetText(char)の説明も交えて教えていただけませんか?

  • iアプリ Tomcatと連携

    前回の質問は、分かりづらいようなので新たに質問させていただきます。 現在、TomcatとiアプリDoja_Ver5.1、MySQLを使いDojaの方からTomcatへアクセスしTomcatからMySQLのデータを取りDojaの方へ表示させたいのですが、下記の文で何度やっても「java.lang.SecurityException: Illegal host」と出てしまいできません。 ADFファイルである、Jamファイルは、Jarファイルと同じ場所にあるので、PackageURLには「dosei_jisaku.jar」としか記述していません。 何故か、java.lang.SecurityException: Illegal hostが出て解決策も見出せずでいます;; public class dosei_jisaku extends IApplication { public void start() { mypanel wp_mypanel = new mypanel(); Display.setCurrent(wp_mypanel); } class mypanel extends Panel{ public mypanel() { add(new Label("項目名:")); TextBox w_name = new TextBox("",8,1,TextBox.DISPLAY_ANY); add(w_name); try { HttpConnection c = (HttpConnection)Connector.open("http://localhost:8080/mfs/mfs/test/dosei_jisakuSV"); ←同PCにあるTomcatのServlet(classファイル)へアクセスしています。 c.setRequestMethod(HttpConnection.GET); c.connect(); if(c.getResponseCode() != HttpConnection.HTTP_OK){ throw new IOException(); } InputStream is = c.openInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); for(;;){ int n = is.read(); if (n == -1) { break; } os.write(n); } String str = new String(); str = os.toString(); w_name.setText(str); os.close(); is.close(); c.close(); } catch(Throwable e) { w_name.setText("読込エラー" + e); } } } } どなたかアドバイスを頂けるようお願い致します…。

  • p.add(myPanel());にエラーが出ます

    試行錯誤の末、テキストボックスの下にタイマーを表示したいので、下のソースのように両方Panelで実装したのですが、p.add(myPanel());にエラーがでます。どう変更すればよいでしょうか? import com.nttdocomo.ui.*; import com.nttdocomo.util.*; public class textbox extends IApplication implements ComponentListener { 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); p.add(myPanel()); Display.setCurrent(p); } class myPanel extends Panel implements TimerListener{ public Timer myTimer; public int cnt = 0; public Label lb; public myPanel(){ //新しいラベルをつくり表示する lb = new Label("カウント開始"); add(lb); //タイマーを作成 myTimer = new Timer(); //タイマーイベントの時間間隔を設定 myTimer.setTime(1000); //タイマーイベントを繰り返し発生させるかどうか設定 myTimer.setRepeat(true); //タイマーリスナーを登録 myTimer.setListener(this); //タイマーの開始 myTimer.start(); } //タイマーイベントの処理 public void timerExpired(Timer iTimer) { cnt++; lb.setText("カウント["+cnt+"]"); } } public void componentAction(Component source , int type, int param) { if(type == ComponentListener.TEXT_CHANGED && source == textbox1) { textbox2.setText(textbox1.getText()); } } }

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

    iアプリのプログラムについて 画面を複数のパネル、キャンバスで切り替えて使用する時、変数はどのように受け渡ししたらよいのでしょうか? 例えば import com.nttdocomo.ui.*; public class TEST extends IApplication { MainCanvas mc; MainPanel mp; public void start() { mc = new MainCanvas(); mp = new MainPanel(); Display.setCurrent(mc); } } class MainCanvas extends Canvas { int DATA_x public MainCanvas() {     ~~~~ } } class MainPanel extends Panel { public MainPanel() {     ~~~~~ ここで変数DATA_xを使用したい!     ~~~~~~ } } という感じです。

    • ベストアンサー
    • Java
  • iアプリ Display#setCurrent使用での画面ちらつき

    こんにちは。 iアプリを作っています。 トップメニュー、サブメニューがあり、1Canvas画面で処理するのが しんどかったので機能毎のCanvasを継承したクラスを作りました。 そのクラスをIApplicationを継承したクラス内のメソッドで Display.setCurrent()を実行して画面を切り替えていますが 切り替え時に画面がちらつきます。 どうにかちらつくことの回避方法はありませんでしょうか。 簡略したソース public class AppliMain extends IApplication {  ACanvas aCanvas = null;  BCanvas bCanvas = null;  public void start () {   aCanvas = new ACanvas ( this );   bCanvas = new BCanvas ( this );   this.showACanvas ();  }  public void showACanvas () {   Display.setCurrent ( aCanvas );  }  public void showBCanvas () {   Display.setCurrent ( bCanvas );  } } public class ACanvas extends Canvas {  private AppliMain parent = null;  public ACanvas ( AppliMain _parent ) {   parent = _parent;  }  public void paint ( Graphics g ) {  }  public void processEvent ( int type, int param ) {   // BCanvasに表示切替   parent.showBCanvas();  } } public class BCanvas extends Canvas {  private AppliMain parent = null;  public BCanvas ( AppliMain _parent ) {   parent = _parent;  }  public void paint ( Graphics g ) {  }  public void processEvent ( int type, int param ) {   // ACanvasに表示切替   parent.showACanvas();  } }

    • ベストアンサー
    • Java

専門家に質問してみよう