• ベストアンサー

AppletのTextFieldとButton

TextFieldに値を入力して、Buttonをクリックするとその値が変数nに代入されるというソースを、どなたか教えていただけませんでしょうか? public void ABC extends Applet{ int n = 0; public void init(){ TextField tf = new TextField("0",5); Button btn = new Button("click!"); this.add(tf); this.add(btn); この後、actionなんちゃらメソッドやらクラスやらでどうにか値をnに入れた結果を実行させたいのですが、よくわかりません。よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 Javaのイベントモデルはその原理さえわかってしまえば、意外と単純です。  たとえば、ボタンのActionEventを処理する場合は、まず、 1.ボタンにActionListenerインターフェースを装備したオブジェクトを登録する。 2.ボタンコンポーネントにActionEvent発生。 3.ボタンはActionListenerとして登録されているオブジェクトのactionPerformedメソッドを呼び出す。  これだけです。  登録するのはActionListenerインターフェースを装備したオブジェクトなら、何でいいです。  ActionListenerインターフェースを装備しているということは、actionPerformedメソッドを持っているということが保障されているので、ボタンは安心して、ただ、actionPerformedメソッドを呼べばよいというわけです。  やり方としては、大きくわけで、内部クラス使う場合とFrameやAppletを継承したクラスにActionListenerを装備させるという二つの方法があるように思います。  サンプルを作ってみましたが、コードをちょっと変更してボタンも二つにしてみました。 (コンパイルするときは全角スペースを半角スペースに変換してからにしてください。)  内部クラスを使う場合は、こんな感じ。↓ import java.applet.*; import java.awt.*; import java.awt.event.*; public class ABC extends Applet{   int n = 0;   int m = 0;      //↓コンポーネントはメンバ変数として保持しておくほうが後からアクセスしやすい。   TextField tf;   Button btnN;   Button btnM;   Label label;      public void init(){     tf = new TextField("0",5);          btnN = new Button("nに代入");     btnN.addActionListener(new BtnN_Clicked());          btnM = new Button("mに代入");     btnM.addActionListener(new BtnM_Clicked());          label = new Label("整数値を入れてください。");          this.add(tf);     this.add(btnN);     this.add(btnM);     this.add(label);   }      //イベントハンドラ用の内部クラス   private class BtnN_Clicked implements ActionListener {     public void actionPerformed(ActionEvent e) {       try {         String numString = tf.getText();         n = Integer.parseInt(numString);         label.setText("n = " + Integer.toString(n));       }       catch (NumberFormatException ex) {         tf.setText("0");         label.setText("整数値ではありません。");       }     }   }      private class BtnM_Clicked implements ActionListener {     public void actionPerformed(ActionEvent e) {       try {         String numString = tf.getText();         m = Integer.parseInt(numString);         label.setText("m = " + Integer.toString(m));       }       catch (NumberFormatException ex) {         tf.setText("0");         label.setText("整数値ではありません。");       }     }   } }  FramやAppletにActionListenerを装備させる方法はこんな感じでしょうか。↓ import java.applet.*; import java.awt.*; import java.awt.event.*; public class ABC extends Applet implements ActionListener {   int n = 0;   int m = 0;      //↓コンポーネントはメンバ変数として保持しておくほうが後からアクセスしやすい。   TextField tf;   Button btnN;   Button btnM;   Label label;      public void init(){     tf = new TextField("0",5);          btnN = new Button("nに代入");     btnN.addActionListener(this);          btnM = new Button("mに代入");     btnM.addActionListener(this);          label = new Label("整数値を入れてください。");          this.add(tf);     this.add(btnN);     this.add(btnM);     this.add(label);   }      public void actionPerformed(ActionEvent e) {     //二つのボタンが一つのメソッドを共有するので、場合わけが必要     Object source = e.getSource();     if (source == btnN) {       try {         String numString = tf.getText();         n = Integer.parseInt(numString);         label.setText("n = " + Integer.toString(n));       }       catch (NumberFormatException ex) {         tf.setText("0");         label.setText("整数値ではありません。");       }     }     else if (source == btnM) {       try {         String numString = tf.getText();         m = Integer.parseInt(numString);         label.setText("m = " + Integer.toString(m));       }       catch (NumberFormatException ex) {         tf.setText("0");         label.setText("整数値ではありません。");       }     }   } }

seagoo
質問者

お礼

 回答ありがとうございます!  内部クラスを使う方法でやってみたのですが、この場合paintメソッドはどこに置けばよいのでしょうか?  例えば、変数nの値をテキストフィールドから入力してボタンを押した後、drawLineで短線をnの数だけ書くというとき、 public void paint(Graphics g){ int i; for(i=0; i<n; i++){ g.drawLine(i, 0, i+0.5, 0); } } はPecoPlusさんのソースのどこに加えたらよいのでしょうか?BtnM_Clickedクラスのあとにポンと置いても、nの初期値にしか反応せず、テキストフィールドに3とか4とか入れてボタンを押しても変化が見られないのでまた困ってしまいました。

その他の回答 (2)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.3

 #1です。 >public void paint(Graphics g){ >  int i; >  for(i=0; i<n; i++){ >    g.drawLine(i, 0, i+0.5, 0); >  } >}  んー、このコードには間違いがありますねぇ。  コンパイルエラーが出るはずですが、どこが間違っているか探してみてください。  それと、yの値が0だと線が引かれても目立ちにくいので、とりあえずもうちょっとと下のほうがよいかと。  さて、コードを改良したとして、paintメソッドはどこにおいたらよいのでしょうか。  ここでは、アプレットの画面に描きたいのですから、Appletクラスを継承しているABCクラスに実装しなくてはいけません。  initメソッドと同じような形で書きます。  ここで、理解しておかないといけないのは、「ABCクラスにpaintメソッドを追加しているのではなく、上書き(オーバーライド)している」ということです。  ABCクラスにはAppletクラスから継承したpaintメソッドをもともと持っているということです。  Appletクラスのドキュメントを見てみると、 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/applet/Applet.html  コンテナから継承しているpaintメソッドをそのまま使っているようです。  見てみると、 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/awt/Container.html#paint(java.awt.Graphics) >軽量コンポーネントが正しく描画されるように >super.paint(g) を呼び出さなければなりません。  今回、軽量コンポーネントは使っていないようですが、これはつけておいたほうがよさそうです。  では、無事にpaintメソッドの改良とオーバーライドができたとします。  「これでバッチリ」と思ってボタンをクリックしても、線は描かれません。  「おかしいな」と思ってウィンドウのサイズを変更したり、最小化して元に戻したりすると、あら、今頃になって線が出てきました。  そもそもpaintメソッドはコンポーネントを描画する必要があるときにシステムによって呼び出されるメソッドです。  逆に言うとその必要があるまで、呼び出されません。  ウィンドウのサイズ変更や最小化から元に戻るときに再描画が必要となり、そこで初めて新しい画面に更新されたわけです。  しかし、そんな悠長なことを言っていられないので、ボタンを押したらすぐに再描画をしてほしいわけです。  そんなときは、repaintメソッドを使います。  どこで、どのオブジェクトのrepaintメソッドを呼べばよいかはもうおわかりですね。

seagoo
質問者

お礼

お蔭様で出来ました。 本当にありがとうございました。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

改造すると以下のようになります。(エラー処理はしてません) public void ABC extends Applet implements ActionListener{ int n = 0; TextField tf; Button btn; public void init(){ tf = new TextField("0",5); btn = new Button("click!"); btn.addActionListener(this); this.add(tf); this.add(btn); } public void actionPerformed(ActionEvent evt){ if(evt.getSource() == btn){ n = Integer.parseInt(tf.getText()); } } ちなみにちゃんと勉強する気があるのなら本の1冊や2冊は読んだ方が良いですよ。

seagoo
質問者

お礼

 回答ありがとうございました!  JAVAの入門書は一冊終わらしたのですが、AWTまで行ってなかったので(-.-;)これからもう一冊買うつもりです。

関連するQ&A

  • java applet

    import java. applet.*; import java. awt. Button; import java. awt. Label; import java. awt. TextField; import java. awt. event.*; public class 1120 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private TextField box2 = new TextField(5); private TextField box3 = new TextField(5); private Label moji1 = new Label(" と "); private Label moji2 = new Label(" の和は "); private Label moji3 = new Label(" である。 "); private Button ok = new Button("OK"); public void init() { resize( 320 , 240); add( box1 ); add( moji1 ); add( box2 ); add( moji2 ); add( box3 ); add( moji3 ); add( ok ); ok.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { int i=0 ,j =0 , k; String t1 = box1.getText(); String t2 = box2.getText(); i = Integer.parseInt( t1 ); j = Integer.parseInt( t2 ); k = i + j; String s = Integer.toString( k ); box3. setText( s ); } } //上記のプログラムを書いたのですが、なぜかエラーが出てしまいます。勿論、自分でも見直しましたが、その理由がわかりませんでした。知識のある方、ご回答の方お願いします。

  • JAVAアプレット(簡易計算機)のプログラム

    足し算を行うだけのプログラムを組むことができたのですが、 四則演算を行いたいと考えています。 下記のようなプログラムでは、ボタンが=のボタンなのですが、 そのボタンを+,-,*,/の4つにおきかえて、各ボタンを押したときに 各ボタンの処理を行うのはどのようにすればいいのでしょうか? 分かる方、ご教授よろしくおねがいします。 import java.applet.Applet; import java.awt.*; // java.awtパッケージのインポート import java.awt.event.*; public class SampleD10L2 extends Applet { private Button btn_culc; // +ボタン private TextField txt_A, txt_B, txt_answer; // 数値入力用テキストボックス public void init() { // ボタンのインスタンスを作成 btn_culc = new Button("="); // ボタンのイベント処理を定義 btn_culc.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { // txt_Aに入力された値 + txt_Bに入力された値を計算 int intAnswer = Integer.parseInt(txt_A.getText()) + Integer.parseInt(txt_B.getText()); // 答えをtxt_answerに表示 txt_answer.setText(Integer.toString(intAnswer)); } }); // コンポーネントの初期化 txt_A = new TextField("0", 3); txt_B = new TextField("0", 3); lbl_plus = new Label(" + "); txt_answer = new TextField("0", 5); // コンポーネントを追加 this.add(txt_A); // 自分自身のaddメソッドを呼び出す(this.は省略可能) this.add(lbl_plus); this.add(txt_B); this.add(btn_culc); this.add(txt_answer); } }

    • ベストアンサー
    • 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
  • 小数の2進数変換について教えてください。

    10進数を2進数に変換するプログラムを作ったのですが、 小数の2進数変換が出来ません。 小数を2進数に変換するにはどうしたらいいのでしょうか? よろしくお願いします。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class Applet1 extends Applet { TextField textField1 = new TextField(10); TextField textField2 = new TextField(10); Button displayButton1 = new Button("2進数変換"); public void init() { displayButton1 = new Button("2進数変換"); add(new Label("10進数")); add(textField1); add(textField2); add(displayButton1); displayButton1.addActionListener(new ToBinaryAction()); } class ToBinaryAction implements ActionListener{ public void actionPerformed(ActionEvent e) { int x = Integer.valueOf(textField1.getText()).intValue(); textField2.setText(Integer.toBinaryString(x)); } } }

    • ベストアンサー
    • Java
  • アプレットと自作パッケージのimportについて

    以下のような、アプレットのプログラムを作ったのですが、コンパイルは通るのですが、アプレットの初期化のところで止まってしまいます。理由と解決策を教えてください。 javac dev_java\TargetApplet\*.java ← これはOK appletviewer dev_java\TargetApplet\TargetApplet.java ←init() で止まる。 (ソース一部抜粋) package dev_java.TargetApplet ; import java.applet.* ; import java.awt.* ; import java.awt.event.* ; import dev_java.Target.* ;  // 自作のpackage /* <applet code="TargetApplet" width=500 height=400> </applet> */ public class TargetApplet extends Applet implements ActionListener, TextListener{ TextField Word ; TextField Mean ; TextArea Result ; Button Search ; Button Entry ; EnglishDictionary ed ; /* 自作package dev_java.Target で宣言されているクラス*/ public void init() { Word = new TextField(20) ; Mean = new TextField(20) ; Search = new Button("Search") ; Entry = new Button("Entry") ; Result = new TextArea(20,40) ; Word.addActionListener(this) ; Word.addTextListener(this) ; Mean.addActionListener(this) ; Mean.addTextListener(this) ; Search.addActionListener(this) ; Entry.addActionListener(this) ; // EnglishDictionary ed = new EnglishDictionary("dic/Target1900.dic") ; this.add(Word) ; this.add(Mean) ; this.add(Search) ; this.add(Entry) ; this.add(Result) ; } }

    • ベストアンサー
    • Java
  • AWTのアプレットにおいてのイベント処理

    javaのAWTでアプレット作成をしているのですがイベント処理部分をどう記述したらいいか解りません。 組み込みたいイベント処理は 1、アプレット起動時に「単語<tab>数字:数字,数字:数字,.......」という形のデータが入っているファイルを読み込んで数字列が一番多い単語(ただし二字熟語~四字熟語)を多い順に9つのボタンのラベルに格納していく。(どの位置のボタンのラベルに格納するかは自由) 2、ボタンを押すと1に書いているファイルを読み込みボタンのラベルに対応した数字列を見つけそれをテキストフィールドに全て出力させる。 ヒントだけでも宜しければ教えてください。お願いします。 /*<HTML> <BODY> <APPLET CODE="Tagcloud.class" WIDTH=400 HEIGHT=350> </APPLET> </BODY> </HTML>*/ //java.appletパッケージをimport宣言 //java.awtパッケージもimport宣言 import java.applet.*; import java.awt.*; import java.awt.event.*; public class Tagcloud extends Applet implements ActionListener{ //AWTのGUIコンポーネントクラスの作成 Button bu1 = new Button(""); Button bu2 = new Button(""); Button bu3 = new Button(""); Button bu4 = new Button(""); Button bu5 = new Button(""); Button bu6 = new Button(""); Button bu7 = new Button(""); Button bu8 = new Button(""); Button bu9 = new Button(""); TextField tf=new TextField(20);//テキストフィールド public void init(){ setBackground(new Color(0,190,221)); //レイアウトを自由に変更 setLayout(null); //アプレット領域にGUIコンポーネント(部品)の追加(載せる) add(bu1); add(bu2); add(bu3); add(bu4); add(bu5); add(bu6); add(bu7); add(bu8);   add(bu9);   add(tf); //コンポーネントの配置 bu1.setBounds(50,50,80,20); bu2.setBounds(150,50,80,20); bu3.setBounds(250,50,80,20); bu4.setBounds(50,120,80,20); bu5.setBounds(150,120,80,20); bu6.setBounds(250,120,80,20); bu7.setBounds(50,190,80,20); bu8.setBounds(150,190,80,20); bu9.setBounds(250,190,80,20); tf.setBounds(50,250,250,20); //ボタンにActionListenerを登録します。 bu1.addActionListener(this); bu2.addActionListener(this); bu3.addActionListener(this); bu4.addActionListener(this); bu5.addActionListener(this); bu6.addActionListener(this); bu7.addActionListener(this); bu8.addActionListener(this); bu9.addActionListener(this); tf.addActionListener(this); } public void actionPerformed(ActionEvent e){ //ここにイベント処理をする部分を記述 } }

  • main()メソッドが無いコード

    最近、Javaアプレット等を勉強してるのですが 今まではmain()メソッドの中に処理を書いて来たのですが、 下記の様なコードにはmain()メソッドが有りません。 import java.applet.Applet; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample6 extends Applet implements ActionListener { Button bt; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); } public void actionPerformed(ActionEvent ae) { bt.setLabel("中止"); } } これはどう言う事なんでしょうか?

    • ベストアンサー
    • Java
  • 簡単な暴走プログラム

    ボタンをクリックすると、classのディレクトリ文字を追加するという プログラにしようと思っています。 ボタンをクリックすると、テキストエリアへの書き込みが止まりません。 ソースではループしているように見えないから原因不明です。 どこが悪く、どう直せばいいんですか? import java.awt.*; public class aaaa0 extends java.applet.Applet { Button btn; TextArea ta; public void init() { add(ta = new TextArea(50, 50)); add(btn = new Button("Btn")); } public boolean action (Event e, Object o) { if (e.target == btn) { String str = ""; String buf = ""; str = getCodeBase().toString(); buf = ta.getText(); ta.setText(buf + "\r\n" + str); } return super.handleEvent(e); } }

    • ベストアンサー
    • Java
  • 整数を好きなだけ入力し、個数、合計、平均値を表示するプログラム

    appletviewerに、ボックスの中に整数を好きなだけ入力し、個数、合計、平均値を以下のように表示させるようなプログラムを作りたいです。(1,2,3を入力した場合)     データ□ (入力)        (計算)   個数=3   合計=6   平均値=2 ※□はボックスです。(入力)(計算)はクリックするボタンです。 どなたかご指導やアドバイスをお願いいたします。まだまだ初心者でとても困っています。。 ちなみに途中まで考えたのが以下のプログラムです。 import java.applet.*; import java.awt.Button; import java.awt.Label; import java.awt.TextField; import java.awt.event.*; public class Lec1106 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private Label moji1 = new Label("データ"); private Label moji2 = new Label("個数="); private Label moji3 = new Label("合計="); private Label moji4 = new Label("平均値="); private Button nyuuryoku = new Button("入力"); private Button keisan = new Button("計算"); public void init() { resize(320,240); add(moji1); add(box1); add(nyuuryoku); nyuuryoku.addActionListener(this); add(keisan); keisan.addActionListener(this); add(moji2); add(moji3); add(moji4); } public void actionPerformed(ActionEvent e)  {int i; String t1=box1.getText(); i=Integer.parseInt(t1);

    • ベストアンサー
    • Java
  • ボタンの複数割り当てについて

    public class TestButton extends Applet implements ActionListener {      Button bt1,bt2,bt3;      public void init()      {           bt1 = new Button("red");           add(bt1);           bt2 = new Button("blue");           add(bt2);           bt3 = new Button("yellow");           add(bt3);           bt1.addActionListener(this);       } java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、      public void actionPerformed(ActionEvent ae) をオーバーライドする必要がありますが、そこで質問です。 ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう