質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • Java

    15532questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    245questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

repaint(); が実行されない

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,132

Launcher

score 13

     class AnimeThread extends Thread {

        public void run() {
        while(mode == 1){
                System.out.println("動作中・・・");
                for(double d=0;d<(angle-vAngle)/vAngle;d+=vAngle){
                    Displace();
                    repaint();

                }
                mode=2;
                repaint();
            }
            try {
                Thread.sleep(150);
            } catch(Exception e) {
                }  
        }
    }


repaintで呼び出されるメソッドはPaintCompnentです。
Displaceは別のメソッドです。

repaintをループの中に入れて、Displaceとrepaintを11回繰り返したいのですが、
実行されるのはDisplaceだけで(それも11回のはずなのに尋常じゃない回数を実行する)repaintは最後の1回だけ。

ループを抜けた後のrepaintは実行されます。

modeはPaintCompnentを呼び出した時にどの処理をするかの判断をするものです。

一応PaintCompnentの中身も貼っておきます。

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        System.out.println("paintComponent");


        if(mode==1){
            //再描画
            System.out.println("移動開始(再描画)");
            for(int p=0;p<size;p++){
                //button自身が持っているx座標とy座標を送って描画する
                ImageIcon icon = RoundButton.drow(button.get(p).getCoordX(),button.get(p).getCoordY(),buttonSize[p], button.get(p),iconList.get(p));    
                button.get(p).setIcon(icon);
            }
            System.out.println("移動完了(再描画)");



        }else if(mode==2){
            //最終的に決められた位置に合わせてずれないようにする
            move();
            System.out.println("最終点に合わせる");
            for(int l=0;l<size;l++){
                ImageIcon icon = RoundButton.drow(xPoint[l],yPoint[l],buttonSize[l], button.get(l),iconList.get(l));    
                button.get(l).setIcon(icon);
            }
            mode=0;
        }

        setOpaque(false);
    }        


どうか助言お願いします!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

最初にAnimeThreadでrepaintを呼び出してますが多分ご自分で定義したComponentの派生クラスのinnerクラスにしているのだと思います。そう仮定してコメントします。

それも11回のはずなのに尋常じゃない回数を実行する

原因はコードからだけではわかりません。ループの中でdをデバッグプリントしてみれば原因を推測できると思います。

repaintは最後の1回だけ。

repaintを呼び出したとき、呼び出しの度にComponent#paintが実行されるというのが質問者さんの期待だと思いますが実際はそう動きません。repaintの効果は「このコンポーネントを後で再描画することを覚えておく」というもので、実際に再描画されるのはEDT(Event Dispatch Thread)で非同期に適当なタイミングで動くと考えた方がよいです。EDT以外のスレッドで連続的にrepaintを呼び出しても1回しか再描画されないというのは普通の動きなのです。

今のプログラムの構造を大きく変えないようにして望みの効果を得るためにはrepaintを呼び出した後sleepするとよいと思います。10msec程度sleepすればその間にEDT上で再描画処理が行われることが充分期待できます。例えば1回の再描画ごとに1度だけ角度をずらしながら線を描画するようにしてrepaintの度に10msecずつsleepしてやるとほぼ期待通りのフレームレートで再描画されることが観察できます。(つまり1秒あたり100度程度角度が変わることが観察できます。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 13:25

    sleepを使い、うまくrepaintが何回も実行されました!
    ありがとうございます!

    キャンセル

0

Displaceが何かわかりませんが、その中でmodeを1,2以外の何かにしていませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 13:22

    回答ありがとうございます!
    特にやっていません。説明不足ですみませんでした。

    キャンセル

0

Swingは扱ったことがないので、資料を読んだだけの情報ですが、
JComponent#repaintメソッドの説明の中に、
コンポーネントの再描画をスケジュールすると記述されているので、
paintComponentの呼び出しは非同期で行われていると考えられます。

repaintが処理できないような間隔で実行された場合、
再描画を実行しても画面がチラつくだけになると思うので、
一番最後のrepaintしか処理されないような設計になっているのではないでしょうか。

for文中にwaitを挟んでみてはいかがでしょう。

(もっとも、どういった動作を期待しているかは分かりませんが・・・)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 13:23

    回答ありがとうございます!
    そのようですね...。別の方法を探してみます。

    キャンセル

同じタグがついた質問を見る

  • Java

    15532questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    245questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。