• 締切済み

Applet内のpaintメソッド

Applet内のpaintメソッドで前もって配列に読み込んでおいた画像を 複数枚表示しようと、for文を利用して描画しています。 しかし、paint()が何回も呼ばれ(コンソールにデバック文を表示して確認) 思ったとおりの配列indexになりません。 paintが起動直後に複数回呼ばれるのは仕様でしょうか? よろしくおねがいします。

みんなの回答

noname#49664
noname#49664
回答No.1

>paintが起動直後に複数回呼ばれるのは仕様でしょうか? 複数回呼ばれる仕様になってるかどうかはわかりませんが、AWTの表示コンポーネントは、再描画の必要が生じたとき、可能な限り速やかにupdateされるように設計されています。  例えば、あるイメージファイルを読み込んで表示するようなとき、ネットワークの環境によっては転送にかかる時間は変わります。すべて読み込むまで全く画面が反応しないのでは困ります。そこでJavaではMediaTrackerで読み込み状態をトラッキングしたり、ImageProducerで更新管理をしたりできるようになっているわけですね。Javaでは必要に応じてイメージの読み込み途中であっても画面が更新できますし、それは必要な措置なわけです。  従って、必要に応じて起動時に複数回表示の更新が行われることはあると思います。 「paint()が何回も呼ばれ(コンソールにデバック文を表示して確認) 思ったとおりの配列indexになりません」 これがよくわからないのですが。paintが何回呼ばれようと、プログラムの動作に影響が出るようなことはないはずですが、いったい、どういうやり方をしているのでしょう? それがわからないと何ともいえないのですが・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • paint()メソッドが呼ばれない

     swingを使って多角形を表示するプログラムを作成しています.polygonクラスを配列に格納して,順番に表示しているのですが,配列中のひとつのpolygonオブジェクトを削除して,再描画を行おうとして,repaint()で一旦画面をクリアして,その後my_paint()で配列中のpolygonを描画させようとしているのですが,    ・  repaint();  my_paint();    ・ my_paint()メソッが呼ばれずに画面がクリアされた状態になってしまいます. どなたか,解決方法をご存知でしたら,ヒントでもいただけるとありがたいです.よろしくお願いします.

    • ベストアンサー
    • Java
  • 【継承】親のメソッドの実行

    C++、VB.net、Java、Delphiなど色々なオブジェクト指向言語がありますが、 以下のようなとき、「子クラスのrunメソッド」を実行したとき、 (1)「親」と表示されてから「子」と表示される。 (2)「子」とだけ表示される。 のそれぞれどちらの仕様なのでしょうか? 親クラス   runメソッド     コンソールに「親」と表示 子クラス   runメソッド     コンソールに「子」と表示 ※私は、 子クラス側で、わざわざ、super.run と書かずとも、 勝手に「(1)「親」と表示されてから「子」と表示される。」になる言語が多いと認識していたのですが、 誤った認識でしょうか? (C++は、明示的に親の同名メソッドをコールしなければ、処理が実行されないと認識していますがC++の仕様は少数派でしょうか?多数派でしょうか?)

  • メソッドを跨いだfor文に関しまして

    皆さん、こんにちわ。 JAVAプログミィングを始めたばかりの初心者です。 自分では解決に至らない内容でしたが、 とっても簡単な質問でしたらごめんなさい。 初心者の割には周りに質問できる人もいないため、 アドバイスいただけるとありがたいです。 今回は、For文の使い方で分からないことがありましたが、 キーワードが悪いのか、 googleで調べきれず、 質問させていただきたく書き込みました。 以下のように、 クラス内で特定の2つのメソッドだけを、 for文で2000回繰り返し処理を行いたいと思っています。 これって、可能なものなのでしょうか? もし可能な場合ですが、 ずずしく大変恐縮ですが、 サンプルの場所などご指摘いただけますと大変ありがたい次第です。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ class { ・メソッド(1){}; ・メソッド(2){}; for (int i = 1 ; i <= 2000 ; i++){ ・メソッド(3){}; ・メソッド(4){}; } }  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ※メソッド3とメソッド4のみ2000回繰り返す感じです。

    • ベストアンサー
    • Java
  • プログラムのメソッド分け

    抽象的な質問で申し訳ありませんが 複数の値を持っていて(arrayとかListとか)それらをあるテーブルにinsertする処理があるとします。 この時、 (1)テーブルへinsertするメソッド用意して、それをfor文で繰り返す (2)複数の値を引数で渡して、メソッドの中でfor分でinsertする 上記のどちらが良いのでしょうか ケースバイケースでしょうか

    • ベストアンサー
    • Java
  • テストメソッド

    テストメソッドを使いプログラムを実行させたいのですが、テストメソッドにエラーが出て正常にプログラムが動くかどうか調べられません。 問題は、配列0の数字を、int型のnumShiftsで与えられた数字の回数だけ一番後ろへ移動させ、それ以外の配列の数字を左へシフトさせます。 つまり、一度配列0の中身を一番後ろに持っていくと、配列1の数字が配列0にくるので、それをまた一番後ろにもって行きます。 そしたら配列2の数字が配列0に来ます。それをまた一番後ろにもって行きます。それをnumShifts回繰り返します。 例) ({1,2,3,4,5,6,7}, 3) 3回移動→ {4,5,6,7,1,2,3} ({1,2,3,4,5,6,7}, 0) 0回移動→ {1,2,3,4,5,6,7} ({1,2,3}, 5) 5回移動→ {3,1,2} プログラムは以下のように組みました。 public class ArrayFun { public void shiftNTimes(int[] array, int numShifts) { for (int i = 0; i < numShifts; i++) { //numShifts回繰り返す for (int j = 0; j < array.length-1; j++) { //配列をシフト int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } } テストメソッドは以下です。 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testshiftNTimes() { ArrayFun af = new ArrayFun(); int[] a1 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a2 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a3 = { 1, 2, 3 };//元の配列 int[] a4 = { 4, 5, 6, 7, 1, 2, 3 };//シフト後の配列 int[] a5 = { 1, 2, 3, 4, 5, 6, 7 };//シフト後の配列 int[] a6 = { 3, 1, 2 };//シフト後の配列 assertEquals(a4, af.shiftNTimes(a1, 3)); assertEquals(a5, af.shiftNTimes(a2, 0)); assertEquals(a6, af.shiftNTimes(a3, 5)); } } エラーは、assertEqualsに赤線が出てしまうことです。 このタイプのAssertでのassertEquals(Object, Object)は、(int[], void)に適切ではないと表示されます。 他のテストメソッドではこのようなエラーは出ないのですが・・・。どなたか解決方法をご存知であれば宜しくお願いします。

    • ベストアンサー
    • Java
  • Eclipseを用いたJARファイル作成について

    Eclipseを用いてjavaのプログラムをしているのですが アプレットのプログラム"のみ"がJARファイルにエクスポートできずに困っております。 [プロジェクト]を右クリック→[エクスポート]→[JARファイル]に設定するところまでは良いのですが 「JARマニフェスト仕様」というページの、「アプリケーションのエントリー・ポイントのクラスを指定」という項目で、メインクラスを参照しても アプレットのプログラムのクラス"のみ"が表示されていないのでエクスポートできません。コンソールのプログラムのクラスは表示されているので おそらく、アプレットにはmainメソッドを用いていないので表示されないのだと思うのですが・・・。 mainメソッドがないプログラムの場合はどうすれば良いのでしょうか・・・? 自分なりに、↓など調べてみたのですがどこがいけないのかわかりません。 http://mailsrv.nara-edu.ac.jp/~asait/java/applet/applet.htm http://sunjava.seesaa.net/article/57546363.html どこをどうすればこの場合、EclipseでJARファイルが作成できるのか、詳しく教えていただければ助かります。 一応、アプレットは↓の簡単なプログラムを試してみました。実行は出来ます。 import java.applet.Applet; import java.awt.Graphics; public class Sample extends Applet { public void paint(Graphics g) { g.drawString("こんにちは",10,10); } }

  • public void paint(Graphics g){

    public void paint(Graphics g){ g.setColor(new Color(ci, ci, ci)); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(Color.WHITE); g.drawString("Canvas表示", 20, 20); g.drawImage(image, x1, y1, this); g.drawImage(image1, x2, y2, this); } public void update(Graphics g){ paint(g); } public void run(){         //while(true)で永久ループ //imageの座標を変更する処理         //repaint();     } スレッドを使ってイメージの座標を変更し、イメージが動くプログラムを作りました。 これだと滑らかに動かないからpaintメソッドをもうひとつ作って 処理するpaintと描画するpaintとにわけたらいいと言われました。 ですがやりかたがわからないので教えてください。

  •  super.paint(g)を呼び出す意味が理解できません。

     super.paint(g)を呼び出す意味が理解できません。  お早うございます、JAVAの初心者です、基本的な内容が理解出ずに悩んでいます。  宜しくお願い致します。  以下のプログラムを書いてやりました、「Sample1」は、public void paint(Graphics g)で オーバライドしてやると、そのまま”java”が表示されますが、JFrameTestでは、 public void paint(Graphics g)のなかに「super.paint(g)」を書いてやらないと、 一応windowは表示はされるのですが、パネルが透明になって下の文字とか、 画像が見えてしまいます。(何故か文法エラーにはなりません)  しかし、public void paint(Graphics g)の内に「super.paint(g)」を書いてやると、 普通通り表示されます。  この違いというか原因はなになのでしょうか。  「super.paint(g)」は親クラスのpaintメソッドをを呼び出していると思うのですが、 何故ここで必要なのでしょうか。  「Sample1」との違いが分かりません、何とぞ宜しくお願い致します。 ======================================================= public class Sample1 extends Applet { public void paint(Graphics g) { g.drawString("java",10,10); } } ============================================================ public class JFrameTest extends JFrame { JFrameTest() { setSize(400,300); setTitle("JFrameTest"); } public void paint(Graphics g) { super.paint(g); g.drawString("Today",100,100); } public static void main(String[] args) { JFrame jf = new JFrameTest(); jf.setVisible(true); } }

    • ベストアンサー
    • Java
  • メソッドが同じオブジェクトのフィールドを参照しません

    <test1.javaファイル> import java.awt.*; public class test1 { //フィールドの定義 public int x = 10; //メソッドの定義 public void drawMoji(Graphics g) { g.drawString("xの値は、" + x, 20, 20); } } <test2.javaファイル> public class test2 extends test1 { //フィールドの定義 public int x = 20; } <mt.javaファイル> import java.awt.*; import java.applet.*; /* <applet code = "mt" width = 300 height = 200> </applet> */ public class mt extends Applet { public void paint(Graphics g) { //インスタンスの作成 test2 t2 = new test2(); //xの値を表すメソッドの実行 t2.drawMoji(g); } } 上記の3つのファイルをコンパイルして、mt.javaファイルをアプレットビュアーで実行したら、"xの値は、20"と表示したいのに、"xの値は、10"と表示されます。t2オブジェクトのフィールドのxの値が20だから、t2.drawMoji(g)で"xの値は、20"と表示されると思うのですが、どうしてこうなるのでしょうか?教えてください。

    • ベストアンサー
    • Java
  • Java applet

    Java appletを使用する課題なのですが、 途中まで書いて、それから止まってしまっています。 アドバイスなど頂ければ嬉しいです。 課題は、 (1)右から左へ動く文字列左から右へ動く文字列とを表示 (2)文字列が消えたらまた出てくるようにする (3)マウスのクリックボタンを押すと止まり、離すと動きだすようにする (2)まで考えたプログラム(コンパイル、実行済)を以下に載せます。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class SasakiYui extends Applet implements Runnable{ Thread th = null; Graphics g; int x; public void init(){ setBackground(Color.white); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void run(){ while(!Thread.interrupted()){ for(x=600;x>-300;x=x-5){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){} } } } public void paint(Graphics g){ g.drawString("Happy Brithday!",x,10); g.drawString("Happy Birthday!",600-x,40); } } (3)ができるようにするには、 addMouseListener(new Mouseadapter(){ public void mousePressed(MouseEvent e){……} を使用するのだろうとは思うのですが、 ・これを組み込むのはpublic void init(){の後で良いか ・……の部分に何を書けばいいのか の2点がわかりません; よろしければ、アドバイスお願い致します!

    • ベストアンサー
    • Java