- ベストアンサー
iアプリの作成で画像が再描画されない問題の解決方法
- iアプリの作成で画像が再描画されない現象が発生しています。解決方法を教えてください。
- MainCanvasクラスにおいて、ダイアログがキャンセルされると画像が消える問題が発生しています。
- どのように作りを変更すれば、キャンバス上の画像が消えずに表示され続けるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Iアプリは作ったことないので、たぶん、こうだろうという感じにしてみました。 「それは、違う」という他の回答者さんのつっこみを期待します。 おそらく、paintメソッドについて誤解されているのだと思います。 paintメソッドは、システムが描画の必要があると判断されたタイミングで、システムによって何度も呼ばれます。 そのときに、paintメソッドはそのコンポーネントの今の姿を描ききらないといけません。 今回のことでいえば、 1. ダイアログが消えた瞬間に、システムが描画の必要があると判断 2. システムが paint メソッドを呼ぶ。 3. しかし、paint メソッドには、image9 を描くコードがかかれていない。 4. よって、image6 だけが描かれ、image9 が消えたように見える。 class MainCanvas extends Canvas { Image image6; Image image9; //image9を表示させるかどうかのフラグ boolean image9IsVisible = false; MainCanvas() { //リソースは paintメソッドで何回も読み込むのではなく、まとめた方がいいのでは? MediaImage mi6 = MediaManager.getImage("resouce:///6.gif"); try { mi6.use(); image6 = mi6.getImage(); } catch (ConnectionException e) { //何らかの例外処理 } MediaImage mi9 = MediaManager.getImage("resource:///9.gif"); try { mi9.use(); image9 = mi9.getImage(); } catch (ConnectionException e) { //何らかの例外処理 } } public void paint(Graphics g) { //paintメソッドでは、引数のGraphicsオブジェクトを使うのが普通なのでは? g.clearRect(0, 0, getWidth(), getHeight()); g.drawImage(image6, 20, 0); if (image9IsVisible) { g.drawImage(image9, 0, 0); } } public void processEvent(int type, int param) { if (type == Display.KEY_PRESSED_EVENT) { if (param == Display.KEY_SELECT) { Dialog dlg = new Dialog(Dialog.DIALOG_YESNO, "終了"); dlg.setText("終了しますか?"); int result = dlg.show(); if (result == Dialog.BUTTON_YES) { IApplication.getCurrentApp().terminate(); } } else if (param == Display.KEY_SOFT1) { image9IsVisible = true; } } } }
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
#1です。 >めんどくさいことになったりしませんか? >自前でやれよ、ってことですよね つまり、そういうことです。 コンポーネントの画像が、変化する場合は、その変化した姿を自前で覚えておく必要があります。 方法としては、 >ずっとそれらの画像と座標位置を保持して持ちまわって という方法と、オフスクリーンバッファを使う方法があります。 オフスクリーンバッファというのは、表示しない Image オブジェクトのことです。 それを保持しておき、画像を変化させる場合は、それに順次、書き込んでいきます。 paint メソッドでは、その Image オブジェクトを drawImage することだけに専念します。 訂正です。 repaint を忘れてました。 } else if (param == Display.KEY_SOFT1) { image9IsVisible = true; //ここに追加 repaint(); }
お礼
度々ご回答ありがとうございます。 お蔭様で、ちょっとお作法が分かった気がします。 paint()は描画に専念するメソッド、 processEvent()では、キーイベントをキャッチし、repaint()に専念する という形で、実現することが出来ました。 だらだらっと書くとprint()がすごいことになってしまうってことですね。
補足
ありがとうございます。 どうやら私はpaint()について勘違いしてたようです・・・。 (因みに引数のgを使ってないのは、多分テスト的にコードをコピペしたせいです) でもpaint()の認識が教えていただいた通りとなると、 あるボタンが押された契機で画像が描画され、ボタンを押せば押すほど画像を 描画する。 かつ描画される度に描画位置が異なる。 そして別なボタンを押すと終了ダイアログが表示される。 というものを作ろうとした場合、めんどくさいことになったりしませんか? ずっとそれらの画像と座標位置を保持して持ちまわって、ということをしなければ ならないのでしょうか? てっきり、描画されていた内容をリフレッシュしてくれるようなものがあるのかと 思っていたのですが、どうもそれも見つからず・・・。 (print()で自前でやれよ、ってことですよね) iアプリの作成というのは初めてで、お作法とか、振る舞いを扱うめんどくささとかが 分からず書き方に悩んでばかりです・・・。