1

コードでグラデーションを使用するとすぐに、サイズ変更中に再描画が実行されません。サイズ変更中にそのようなものが表示されます(サイズ変更された黒い長方形。下のリンクの画像を参照してください)。そして、サイズ変更をやめると、すべてが再び描画されますが、それはそのときだけです。

使用しない場合g2d.setPaint(gradient);は、すばやく再描画します

http://gui-builder.com/C41142775162.rar

public void paintComponent(Graphics g)  
{  

        super.paintComponent(g);  

        Graphics2D g2d = (Graphics2D)g;  

        //sample of the code  
        GradientPaint gradient = new GradientPaint(startX, startY, greyColor1, endX, endY, new Color(120,120,120));  
        g2d.setPaint(gradient);  
        g.drawLine(i, startY, i, endY);  
}  

repaint()サイズ変更を試みました。マウスをドラッグしたときに試みましたrepaint()が、何もしませんでした。


ここにいくつかのSSCCEがあります(申し訳ありませんが、以前は投稿していませんでした):

BufferedImage aa;

@Override  
public void paintComponent(Graphics g)  
{  
        super.paintComponent(g);  

        Graphics gr = aa.getGraphics();  
        Graphics2D g2d = (Graphics2D)gr;  

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
                    RenderingHints.VALUE_ANTIALIAS_ON);  


        for (int i = 0; i < this.getWidth(); i++)  
        {  
            LinearGradientPaint lgp = new LinearGradientPaint(
            new Point2D.Float(0, 0),
            new Point2D.Float(0, this.getHeight()),
            new float[] {0f, 0.5f, 1f},
            new Color[] {Color.BLUE, Color.RED, Color.BLUE}
            ); 
            g2d.setPaint(lgp);  
            gr.drawLine(i, 0, i, this.getHeight());  
        }  
        g.drawImage(aa, 0, 0, frame);  
}  

そしてあなたのコンストラクターで:

aa = new BufferedImage(100、100、BufferedImage.TYPE_INT_ARGB);

ウィンドウのサイズを変更したときに(ウィンドウのサイズ変更コーナーを移動しているときに)再描画が行われない理由については、まだ回答が必要です。


要約すると、Javaで描画する3つの主要な方法であるBufferStrategy、double Swingバッファリングされた画像、および画像バッファなしの単純なswingを試しました。そして、私は速いものが最後のものであることがわかりました(驚くべきことに)。

今私は速いものを使用しています、そして私は最初にウィンドウを小さいサイズにサイズ変更し、次にウィンドウを大きいサイズにサイズ変更すると問題が消えることを発見しました。それが私の問題であり、それは完全な謎です。笑わないでください。ここにそれのビデオがあります:C41142775162.rar

小さいサイズにサイズ変更するとどうなりますか?私は知らないよ。しかし、あなたが何か助けを知っているならば、大いに感謝されるでしょう。

ありがとう

ジェフ


また、setPaintをできるだけ使用しないことが最善であることがわかりました。テストを実行すると、setPaint()を頻繁に使用しない方がはるかに高速であることがわかります。たとえば、次を使用する代わりに:

LinearGradientPaint gradient1 = new LinearGradientPaint(
        new Point2D.Float(0, 0),
        new Point2D.Float(0, 10),
        new float[] {0f, 1f},
        new Color[] {new Color(40,40,40), new Color(110,110,110)}
    );
LinearGradientPaint gradient2 = new LinearGradientPaint(
        new Point2D.Float(0, 10),
        new Point2D.Float(0, 20),
        new float[] {0f, 1f},
        new Color[] {new Color(110,110,110), new Color(190,190,190)}
    );
LinearGradientPaint gradient3 = new LinearGradientPaint(
        new Point2D.Float(0, 20),
        new Point2D.Float(0, 30),
        new float[] {0f, 1f},
        new Color[] {new Color(190,190,190), new Color(250,250,250)}
    );                        
for (int i = 0; i < this.getWidth(); i++)
{
    g2d.setPaint(gradient1);
    gr.drawLine(i, 0, i, 10);
    g2d.setPaint(gradient2);
    gr.drawLine(i, 10, i, 20);
    g2d.setPaint(gradient3);
    gr.drawLine(i, 20, i, 30);                            
}

使用する :

LinearGradientPaint gradient1 = new LinearGradientPaint(
        new Point2D.Float(0, 0),
        new Point2D.Float(0, 10),
        new float[] {0f, 1f},
        new Color[] {new Color(40,40,40), new Color(110,110,110)}
    );
LinearGradientPaint gradient2 = new LinearGradientPaint(
        new Point2D.Float(0, 10),
        new Point2D.Float(0, 20),
        new float[] {0f, 1f},
        new Color[] {new Color(110,110,110), new Color(190,190,190)}
    );
LinearGradientPaint gradient3 = new LinearGradientPaint(
        new Point2D.Float(0, 20),
        new Point2D.Float(0, 30),
        new float[] {0f, 1f},
        new Color[] {new Color(190,190,190), new Color(250,250,250)}
    );                         

g2d.setPaint(gradient1);
for (int i = 0; i < this.getWidth(); i++)
     gr.drawLine(i, 0, i, 10);

g2d.setPaint(gradient2);
for (int i = 0; i < this.getWidth(); i++)
    gr.drawLine(i, 10, i, 20);

g2d.setPaint(gradient3);
for (int i = 0; i < this.getWidth(); i++)
    gr.drawLine(i, 20, i, 30); 

計算量が多い場合でも、ほぼ毎回高速になります。

4

2 に答える 2

2

テストをまとめたところ、GradientPaintパフォーマンスがひどいことがわかりました。平均レンダリング時間を1.2秒(400x400ピクセル)から20秒以上にします。

を変更したGradientPaintところLinearGradientPaint、代わりにレンダリング時間が約1.3秒であることがわかりました。

LinearGradientPaint lgp = new LinearGradientPaint(
                new Point2D.Float(0, minY),
                new Point2D.Float(0, maxY),
                new float[] {0f, 0.5f, 1f},
                new Color[] {Color.BLUE, Color.RED, Color.BLUE}
                );
g2d.setPaint(lgp);
    // Render all your samples, don't reapply or change you paint...

申し訳ありませんが、私のサンプルはあまりエキサイティングではありません...

ここに画像の説明を入力してください

代わりに、バックグラウンドスレッドのバッキングバッファにレンダリングし、完成したら画像全体を画面にペイントする方がよい場合があります。これにより、画面が「一時停止」するのを防ぎます

于 2012-08-20T13:52:17.577 に答える
1

これがアプレットの場合は、その物を入れます

public void start()
{
}

public void stop()
{
}
于 2012-08-20T12:19:26.773 に答える