- 締切済み
アプレットとボタン
今現在アプレットについて勉強しているものです。 少し行き詰っているので助けてもらえるとありがたいです。 今アプレットのキャンバスを使い時計と作ろうとしています。 ですがただの時計(スレッドでやるお決まりの時計)は出来るのでGUIのボタンを少しつかってみようと思い、 「ボタンが押されてから時計がスタートする」というものを作ろうとしました。 そこで考えたのが、まずボタンとキャンバスを作っておいて、 ボタンが押されたら、ActionPerformedのメソッド内でスレッドを作成して、 キャンバスの時計を進めるという方法なのですが どうしてもキャンバスのインスタンスを作成した瞬間に、 キャンバスのpaint()が呼ばれて、時計が少し進んでしまいます。 完全にボタンを押した後に、キャンバスが呼ばれ、paint()もそこからスタートするようにするにはどうしたらいいでしょうか? 要するに、Appletのpaintメソッドをボタンが押された後に始めて動くようにしたいのです;;
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- _ranco_
- ベストアンサー率58% (126/214)
paint()の中に、適当なif(){}条件を書けばよいでしょう。たとえば何らかのboolean変数が、最初にactionPerformed()が呼ばれたときにtrueになるとか…。
- lailai2580
- ベストアンサー率64% (16/25)
No.1です。 Appletを継承してないとかpaint(Graphics g)ではないとか、いろいろ間違ってますけどそんな気分ってことで^^;
- lailai2580
- ベストアンサー率64% (16/25)
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(){ // 時計を描画する処理 } }