- ベストアンサー
iアプリ、それともJava(?)における文字表示の挙動について
- iアプリ、Javaにおける文字表示の挙動を解説します。
- ループ処理による文字表示の初期化の仕組みについて教えてください。
- 文字と文字が重ならずに表示される理由についてお聞きしたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
蓄積というのがどういうことなのかが今ひとつ理解できていないですが、 以下のコードを実行したところ、 「毎回のループの初めに行われているであろう、真っ白な状態への初期化」というのはなく 1ptずつのずらしのため文字を認識できないですが重ねて描画しているように見えますが。。。 ***** import com.docomostar.StarApplication; import com.docomostar.ui.Canvas; import com.docomostar.ui.Display; import com.docomostar.ui.Graphics; public class App extends StarApplication { public void started(int arg0) { C c = new C(); Display.setCurrent(c); new Thread(c).start(); } } class C extends Canvas implements Runnable { public void paint(Graphics arg0) { } public void run() { Graphics g = getGraphics(); int i = 1; while (true) { g.lock(); g.drawString("hogehoge", 0, 15 + i);// 下にずれて表示されていく。 g.unlock(true); i++; }// while() } } *****
その他の回答 (2)
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 iアプリは作ったことないので、違うかもしれませんが、ダブルバッファリングをしているのが、原因ではないですか? lock() と unlock() を外すと、どうなりますか?
お礼
回答頂き、ありがとうございます。 >lock() と unlock() を外すと、どうなりますか? 有無で、どう異なるか調べてみましたが、 変化はなさそうです。 ダブルバッファリングを取り去っても、 相変わらず、文字は残らず…、 でした。 これは、なんでなのでしょうね~。 単純なハローワールド出力ならば残るのに、 run()とwhile(true)ループの組み合わせの中では、 残らないんですよね。(run()は関係ないかもしれませんが。) デフォルトでは、g.drawString()された文字列は、 その場に残る、と思うのですが、それが実際には残らないというのは、 おそらく、whileループ毎に、画面が白紙化されているからだと思うのです。 で、その白紙化しているのが、誰なのか…
- planet_9_9
- ベストアンサー率68% (57/83)
whileループ内で、iを1にしてるので、 g.drawString("hogehoge", 0, 16); をずっと繰り返してることになり、 結果として、一回の描画と変わらないように見えているのでは。 あと、drawString()のy座標はフォントの高さを考慮しないと 文字列が重なって表示されます。
お礼
すみません、私の記述ミスでした。 public void run(){ Graphics g = getGraphics(); int i = 1; while(true){ g.lock(); g.drawString("hogehoge",0,15 + i); //下にずれて表示されていく。 g.unlock(true); i++; }//while() }//run() i の宣言位置を間違えていました。 この記述で、質問をお読み頂ければと思います。 (つまり、描画位置は、下に移動していく) 私がここで問題としているのは、 ループで表示処理をしても、 過去の表示が蓄積されていかない、ということです。 つまり、重なることがないのです。 同時期(つまり、同じwhile世代)に表示処理をした文字列であれば、 その時点においては重なることもあるのですが、 ループ世代の異なる文字同士は重ならないんです。 と言いますか、 現在の表示しかされないため、過去の表示と重なることがない、といった感じです。 この、「表示(描画)が蓄積されていかない」ことに、疑問を感じているわけですが、 何かご存知でしたら、教えて下さい。 よろしくお願い致します。
お礼
記述頂いたサンプルソースのおかげで、問題が解決しました!!! まず、同様のプログラムを私も書き(StarではなくDojad5.1で)、 実行したところ、おっしゃるとおり、蓄積されるのです。 では、なぜ?? はい、原因がわかりました。 質問のコードには書いていませんでしたが、 「g.fillRect(0,0,getWidth(),getHeight());」 こいつが、真っ白しろすけの生みの親でした!! この1文は、文字列出力する前の、下準備として入れられていたものなのですが、 こいつが真っ白提供者だったとは…。 って、初めからそれを書いておけよ、とツッコミが入りそうで恐縮ですが、 無事、原因が分かって良かったです。 いやはや、助かりました。 粘り強く私の質問にお付き合い下さり、本当にありがとうございました。 また機会がございましたら、色々と教えて下さい!