• 締切済み

アプレットとボタン

今現在アプレットについて勉強しているものです。 少し行き詰っているので助けてもらえるとありがたいです。 今アプレットのキャンバスを使い時計と作ろうとしています。 ですがただの時計(スレッドでやるお決まりの時計)は出来るのでGUIのボタンを少しつかってみようと思い、 「ボタンが押されてから時計がスタートする」というものを作ろうとしました。 そこで考えたのが、まずボタンとキャンバスを作っておいて、 ボタンが押されたら、ActionPerformedのメソッド内でスレッドを作成して、 キャンバスの時計を進めるという方法なのですが どうしてもキャンバスのインスタンスを作成した瞬間に、 キャンバスのpaint()が呼ばれて、時計が少し進んでしまいます。 完全にボタンを押した後に、キャンバスが呼ばれ、paint()もそこからスタートするようにするにはどうしたらいいでしょうか? 要するに、Appletのpaintメソッドをボタンが押された後に始めて動くようにしたいのです;;

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

みんなの回答

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

paint()の中に、適当なif(){}条件を書けばよいでしょう。たとえば何らかのboolean変数が、最初にactionPerformed()が呼ばれたときにtrueになるとか…。

回答No.2

No.1です。 Appletを継承してないとかpaint(Graphics g)ではないとか、いろいろ間違ってますけどそんな気分ってことで^^;

回答No.1

paint()が呼ばれて時計が進むということはpaint()内でスレッドを作成して動かしているということですか? 質問者様が仰るようにActionPerformedメソッド内でスレッドを作成すればそのようになることはないと思いますが…。 以下のような気分で良いような気がします。 class Test implements Runnable, ActionListener{  boolean started = false;  (中略)  public void actionPerformed(ActionEvent e){   if(!started){    started = true;    Thread thread = new Thread(this);    thread.start();   }  }  public void run(){   while(true){    // 時計を進める処理    try{     Thread.sleep(1000);    }catch(Exception e){}    repaint();   }  }  public void paint(){   // 時計を描画する処理  } }

関連するQ&A

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • javaでアプレットを使用していますが、

    javaでアプレットを使用しています。 startメソッドでkicker.start();しているのに、 stopメソッドではkicker=null;はしているものの、 kicker.stop();は推奨されていません。 これで開始されたスレッドが停止するのでしょうか?

  • Javaアプレットで複数のスレッド (初心者です)

    javaアプレットで二つのスレッドを作り、それぞれからパラパラアニメ(0.4秒間隔で絵が変わるものanime1と0.7秒のものanime2)を表示させたいと考えています。 パラパラアニメ本体はhttp://www.ipc.hokusei.ac.jp/~z00104/java/anim.htmlをほぼコピーで使わせてもらい、それ単体では動かせました。 しかし二つスレッドを作るためにRunnableを実装したクラスを二つ用意して、それをまた別の一つのクラスから呼び出すことがうまくできません。 public class oshietegoo extends Applet{ anime1 aa = new anime1(); anime2 bb = new anime2(); Thread a = new Thread(aa); Thread b = new Thread(bb); a.start(); b.start(); //(スレッドの作成についてはhttp://www.tohoho-web.com/java/thread.htmを参考にしました) } class anime1 extends Applet implements Runnable{ 【中身は最初のURLのコピー】 } class anime2 extends Applet implements Runnable{ 【中身は最初URLのコピー】 } というように書いているのですが、a.start();とb.start();のところで「トークン "start" に構文エラーがあります。このトークンの後には Identifier を指定する必要があります」とエラーが出てしまいます。 色々と調べたり、インスタンスやクラスなど基本的な概念を勉強したりしたつもりなのですが、なぜエラーが出るのか分かりませんでした……。 どなたか解決法を教えていただけませんでしょうか? 初心者な質問で申し訳ないのですが、お力添えいただけると助かります。 不足があれば追記いたしますので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • java アプリケーションをjava アプレットに

    java超初学者です。詳しいかたご教授願います。 java アプリケーションをjava アプレットに書き換えたいのですが、具体的にはどう書き換えを行ったらいいのか修正をお願いします。 (文字制限があるので、14個あるクラスファイルの中で(内1つはhtmlファイル)、メインメソッドを持つ実行クラスだけのせています。) Appletを継承させる、属性をメインクラスとコンストラクタはpublic にする、 mainメソッドを削除し、initメソッドへ書き換える、サイズ指定は<applet>タグで指定する。等調べましたが 具体的にわかりません。特にコンストラクタとメインメソッドの部分のアプレットへの書き換えがわかりませんでした。 宜しくお願い致します。 //実行クラスです。 import java.awt.*; import java.awt.event.*; /** *ゲームクラス(ここから始まる)<p> *画面の作成 */ public class Game extends Frame { /** * メインクラス */ public static void main(String args[]) { //フレームの作成 new Game(); } /** * 引数なしのコンストラクタ */ Game() { //*** ウィンドウの初期化 //タイトル super("Shooting Game"); //クローズボタンによる終了処理の実装 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); setSize(500, 500); //ウィンドウのサイズ //*** キャンバスの初期化 MyCanvas mc = new MyCanvas(); add(mc); //フレームにキャンバスを追加 setVisible(true); //ウィンドウの表示 //ゲームデータの初期化 mc.init(); //スレッドを作成 mc.initThread(); } }

  • Javaアプレットで描画の中断がしたい

    Java初心者です。学校の課題で数学シュミレーションの結果を Javaアプレットで表示するプログラムを作成しています。 この課題のJavaアプレットでは 複素平面のシュミレーション(計算結果を色のグラデーションで表示する)なのですが、 チョイスやボタン、マウスクリックなどによって、 初期条件や、描画方式、表示範囲などを指定することができます。 とりあえず、シュミレーション結果の描画は 試行錯誤の結果表示ができるようになりました。 paint(Graphics g)メソッドで数値計算、及び描画をしています。 (ちなみに余談かもしれませんがダブルバッファリングをしていて、 描画内容をImageとして書き込んでおいて描画するというかたちです。) 「計算途中(計算には結構時間がかかる)に 新たにボタンなどで指定条件が変更された場合、 現在の描画を中断して次の計算と描画を開始できるように プログラムを改良しなさい」というのが今回の課題です。 つまり、「プログラム的にはpaintメソッドが実行されている途中に 特定のイベントが発生したらpaintメソッドを中断し、 もういちど呼びなおしなさい」ということかと思われます。 スレッドを作り、そのスレッドを中断するなども考えました。 インターネットで検索もしてみましたが、 なかなか情報を見つけられず困っています。 学生が作るプログラムなのでそんなに難しいことではないのだと思うのですが 解決できませんでした。 どうぞよろしくお願いします。

  • Start : アプレットは初期化されていません。

    閲覧ありがとうございます。 Fedora15でjavaの勉強をしてる者なのですが、端末では実行するとちゃんと表示されるのですが HTMLファイルをダブルクリックで実行するとタイトルのエラーが出て困っています。 内容としては、スレッドの勉強でスタートボタンを押すとリンゴが2個落ちるプログラムです。 もしよろしければ、アドバイスを頂けると嬉しいです。 下記ソースコード。 import javax.swing.*; import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.lang.*; public class Apple extends Applet implements Runnable,ActionListener { Image bu; //バッファ宣言 Graphics off_g; //グラフィック宣言 JButton b, bb; //スタートボタン Image img1 ; //ringo.gifを格納 int s=0, w = 450, h = 300; int a1 = 0, b1 = 1, a2 = 0, b2 = 1; Thread th ; //スレッドのインスタンス生成 boolean threadFlg = false; public void init(){ a1 = 0; b1 = 1; a2 = 0; b2 = 1; setBackground(Color.white); b = new JButton("スタート"); b.addActionListener(this); add(b); b.setBounds(300,30,100,30); bb = new JButton("ストップ"); bb.addActionListener(this); add(bb); bb.setBounds(370,30,100,30); threadFlg = true; th = new Thread(this); th.start(); img1 = getImage(getClass().getClassLoader().getResource("ringo.gif")); } public void actionPerformed(ActionEvent e){ if(e.getSource() == b){ s = 1; } if(e.getSource() == bb){ stop(); } } public void run(){ while(threadFlg){ if( s == 1){ a1 = a1 + b1; System.out.println(a1); a2 = a2 + b2; System.out.println(a2); if(a1 >= 300 && a2 >= 300 ){ break; } repaint(); } try{ th.sleep(30); }catch(InterruptedException e){} } } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ super.paint(g); if(s == 1){ off_g.drawImage(img1,30,a1,this); off_g.drawImage(img1,250,a2,this); g.drawImage(bu,20,30,this); } } public void start(){ bu=createImage(w,h); off_g=bu.getGraphics(); //グラフィックコンテキストを得る? } public void stop(){ threadFlg = false; th = null; } } <html> <title>Apple</title> <body> <applet code="Apple.class" width="450" height="300"> </applet> </body> </html>

  • アプレットで・・

    「アプレットでボタンが押されたら、指定したファイルに文字列を書きだす」 というものを作ってるのですが、書き出されません・・。 内容は・・・ public class Kaku extends Applet implements ActionListener{ String file ="c:\\kaku\\goo.txt"; Button but; public void init() { but = new Button("書き出す"); but.addActionListener(this); add(but); } public void actionPerformed(ActionEvent event) { // but.setLabel("結果"); try{ FileWriter fw = new FileWriter(new File(file)); fw.write("GOO"); fw.close(); }catch(IOException e){ ex.printStackTrace(); } } } FileWriter 単体でプログラムを組むと、うまく書き出されるのですが、アプレットになるとダメです・・。 何か考え間違いをしているのでしょうか? 助言、よろしくお願いします。

    • ベストアンサー
    • Java
  • コンポーネントの組み込みについて

    アプレットでもAWTアプリでもSwingアプリでもなんでもいいんですが、 特定の条件を満たした時に、はじめは表示されていないボタンやテキストフィールドなどを後から表示させたいのですが、できません。 単純にadd()ではできないようで… やり方を教えていただけませんか。。 下は、10秒後にボタンが表示されるように自分で作ってみたサンプルアプレットです。 //<applet code="buttonsample.class" width=300 height=200></applet> import java.applet.*; import java.awt.*; import java.awt.event.*; public class buttonsample extends Applet implements Runnable { int count; //カウント Thread th; //スレッド Button BT; //ボタン public void init() { setLayout(new FlowLayout()); count = 0; BT = new Button(); BT.setLabel("ボタン"); } public void start() { if(th == null) { th = new Thread(this); th.start(); } } public void stop() { th = null; } public void run() { while(count < 10) { repaint(); count++; try { Thread.sleep(1000); } catch(InterruptedException e){} } add(BT); } public void paint(Graphics g) { g.drawString(""+(count+1),100,100); } } <EOS>

    • ベストアンサー
    • Java
  • JAVAでアプレットのエラー(eclipse)の意味が分かりません

     JAVAプログラムをeclipseで書いています。  新しくプロジェクトをパッケジエクスプローラに作成し、ドラッグアンドドロップでメモ帳で書いたソースコードを プロジェクト内に落とし込んでやりました。  実行すると、アプレットのウインドウは表示されるのですが、「Start アプレットは初期化されていません」 とウインドウに表示されます。  一体何が原因でしょうか。  コード自体にはエラーはなく、コンソールには、以下のようなコメントが出ていますが、エラーの意味が分かりません、 一体どういうことなのでしょうか。  このようなドラッグアンドドロップのやり方は間違っているのでしょうか。 java.lang.ClassCastException: JFrameTest cannot be cast to java.applet.Applet at sun.applet.AppletPanel.createApplet(Unknown Source) at sun.applet.AppletPanel.runLoader(Unknown Source) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

    • ベストアンサー
    • Java
  • アプレットがうまく動かない…

    javaを勉強しています。本を参考にして、下記のようなアプレットを書いたのですが、さらにその下のようなエラー(?)が表示されてしまって、画像が表示されません。もしこれだけの情報で見当がつきましたら、よろしくお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class main extends Applet{ Image img; public void init(){ img = getImage(getDocumentBase(), "test.jpg"); } public void paint(Graphics g){ g.drawImage(img,0,0,this); } } java.lang.UnsupportedClassVersionError: main (Unsupported major.minor version 49 .0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:537) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12 3) at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:157) at java.lang.ClassLoader.loadClass(ClassLoader.java:289) at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:123) at java.lang.ClassLoader.loadClass(ClassLoader.java:235) at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:561) at sun.applet.AppletPanel.createApplet(AppletPanel.java:617) at sun.applet.AppletPanel.runLoader(AppletPanel.java:546) at sun.applet.AppletPanel.run(AppletPanel.java:298) at java.lang.Thread.run(Thread.java:534)

    • ベストアンサー
    • Java

専門家に質問してみよう