не перерисовывать при изменении размера при использовании .setPaint (градиент)

Как только я использую градиенты в своем коде, перерисовка не выполняется при изменении размера, я получаю нечто подобное при изменении размера (черные прямоугольники там, где они были изменены, см. Изображение в ссылке ниже). И когда я перестаю изменять размер, все рисуется снова, но только потом.

если я не использую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 = новый BufferedImage (100, 100, BufferedImage.TYPE_INT_ARGB);

Мне все еще нужен ответ, почему перерисовка не выполняется, когда я изменяю размер окна (в то время как я перемещаю угол изменения размера окна)

Итак, подведем итоги: Я попробовал три основных метода рисования в Java: BufferStrategy, двойное 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); 

даже если у вас много вычислений, это будет почти каждый раз быстрее!

Ответы на вопрос(2)

Ваш ответ на вопрос