Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用.setPaint(渐变)调整大小时不重新绘制_Java_Swing_Image Resizing_Repaint_Paintcomponent - Fatal编程技术网

Java 使用.setPaint(渐变)调整大小时不重新绘制

Java 使用.setPaint(渐变)调整大小时不重新绘制,java,swing,image-resizing,repaint,paintcomponent,Java,Swing,Image Resizing,Repaint,Paintcomponent,当我在代码中使用渐变时,在调整大小时不会重新绘制,我在调整大小时会得到类似的结果(调整大小的黑色矩形,请参见下面链接中的图像)。当我停止调整大小时,一切都会重新绘制,但只有在那时 如果我不使用g2d.setPaint(渐变)我有一个快速重画 我试图repaint()在调整大小时,我试图repaint()当拖动鼠标时,但什么都没有 以下是一些SSCE(对不起,我之前没有发布): 缓冲图像aa @Override public void paintComponent(Graphics g)

当我在代码中使用渐变时,在调整大小时不会重新绘制,我在调整大小时会得到类似的结果(调整大小的黑色矩形,请参见下面链接中的图像)。当我停止调整大小时,一切都会重新绘制,但只有在那时

如果我不使用
g2d.setPaint(渐变)我有一个快速重画

我试图
repaint()
在调整大小时,我试图
repaint()
当拖动鼠标时,但什么都没有


以下是一些SSCE(对不起,我之前没有发布):

缓冲图像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);  
}  
@覆盖
公共组件(图形g)
{  
超级组件(g);
Graphics gr=aa.getGraphics();
Graphics2D g2d=(Graphics2D)gr;
g2d.setRenderingHint(RenderingHints.KEY_抗锯齿,
RenderingHints.VALUE_ANTIALIAS_ON);
for(int i=0;i
在您的构造函数中:

aa=新的BuffereImage(100100,BuffereImage.TYPE_INT_ARGB)

我仍然需要一个答案,为什么在我调整窗口大小时(当我移动窗口的调整大小角时)没有进行重画


好的,总结一下: 我尝试了用Java绘制的三种主要方法,即缓冲策略、双Swing缓冲图像和无图像缓冲的简单Swing。 我发现跑得快的是最后一个(令人惊讶)

现在我使用的是快速的,我发现首先将窗口大小调整为一个小尺寸,然后将窗口大小调整为一个大尺寸,这样问题就消失了。别笑,这是我的问题,这完全是个谜。 以下是一段视频:

当我调整到小尺寸时会发生什么?我不知道。但如果你知道任何帮助,我将不胜感激

谢谢

杰夫


我还发现最好尽可能少地使用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渐变1=新的LinearGradientPaint(
新的Point2D.Float(0,0),
新点2D.浮点(0,10),
新浮点[]{0f,1f},
新颜色[]{新颜色(40,40,40),新颜色(110110)}
);
LinearGradientPaint渐变2=新的LinearGradientPaint(
新点2D.浮点(0,10),
新点2D.浮点(0,20),
新浮点[]{0f,1f},
新颜色[]{新颜色(110110),新颜色(190190)}
);
LinearGradientPaint渐变3=新的LinearGradientPaint(
新点2D.浮点(0,20),
新点2D.浮点(0,30),
新浮点[]{0f,1f},
新颜色[]{新颜色(190190),新颜色(250250)}
);                        
for(int i=0;i
使用:

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); 
LinearGradientPaint渐变1=新的LinearGradientPaint(
新的Point2D.Float(0,0),
新点2D.浮点(0,10),
新浮点[]{0f,1f},
新颜色[]{新颜色(40,40,40),新颜色(110110)}
);
LinearGradientPaint渐变2=新的LinearGradientPaint(
新点2D.浮点(0,10),
新点2D.浮点(0,20),
新浮点[]{0f,1f},
新颜色[]{新颜色(110110),新颜色(190190)}
);
LinearGradientPaint渐变3=新的LinearGradientPaint(
新点2D.浮点(0,20),
新点2D.浮点(0,30),
新浮点[]{0f,1f},
新颜色[]{新颜色(190190),新颜色(250250)}
);                         
g2d.setPaint(梯度1);
for(int i=0;i

即使你有很多计算,它几乎每次都会更快

如果这是一个小程序,请将其放入

public void start()
{
}


我做了一个测试,发现
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...
对不起,我的样品不太令人兴奋


您可能会发现更好的方法是在背景线程中渲染到备份缓冲区,并在完成后将整个图像绘制到屏幕上。这将阻止屏幕变为“暂停”

1)请学习如何使用代码格式。选择代码并单击
{}
按钮。2) 为了更快地获得更好的帮助,请发布一条消息。停止调整大小是什么意思?你释放了鼠标吗?停止调整大小我的意思是停止移动窗口的调整大小角+1,一如既往。大到你一直在积累的疯狂名声:哦,没有双关语intended@DavidKroukamp我真不敢相信我在过去几个月里学到了这么多。不只是从人们的答案,而是从探索问题寻找答案。还是让我大吃一惊,我还有很多东西要学!谢谢你的回答,太好了。我试过了,但还是遇到了“调整大小时不重画”的问题。我在尝试BufferStrategy时使用了BufferStrategy(也尝试了不使用BufferStrategy的情况下使用普通的Swing双buff)
public void stop()
{
}
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...