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...