一旦我在代码中使用渐变,在调整大小时重新绘制就不会完成,我在调整大小时会得到类似的结果(已调整大小的黑色矩形,请参阅下面链接中的图像)。当我停止调整大小时,所有内容都会再次绘制,但只有那时。
如果我不使用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(抱歉我之前没有发布):
缓冲图像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中绘图的三种主要方法,即BufferStrategy、双Swing缓冲图像和无图像缓冲区的简单Swing。
我发现最快的是最后一个(令人惊讶)。
现在我使用的是快速的,我发现首先将窗口大小调整为小尺寸,然后将窗口大小调整为大尺寸可以使问题消失。别笑,这是我的问题,这完全是个谜。
这是它的视频:C41142775162.rar
当我调整为小尺寸时会发生什么?我不知道。但如果您知道任何帮助将不胜感激。
thanks
Jeff
我还发现最好尽可能少地使用 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);
}
use :
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);
即使你有很多计算,它几乎每次都会更快!