一旦我在代码中使用了渐变,在调整大小时就不会完成重新绘制,而在调整大小时
会得到类似的信息(已调整大小的黑色矩形,请参见下面的链接中的图像)。当我停止调整大小时,一切都会
再次绘制,但只有那时。
如果我不使用,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中的三种主要绘制方法:
BufferStrategy,双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);
}
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);
even if you have a lot of computations, it will be almost every time faster!
我进行了测试,发现其 性能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...
抱歉,我的样品不是很令人兴奋……
您可能会发现,最好改为在后台线程中渲染到后台缓冲区,并在完成后将整个图像绘制到屏幕上。这将阻止屏幕“暂停”
我正在尝试构建一个包含6个窗格(作为父级添加到GridPane布局中)的简单Java项目。我必须在开始时设置窗口大小,并通过参考根布局的宽度和高度,设法将它们均匀地拆分。 但我想要他们调整大小,因为我改变了窗口的大小(使用鼠标,现在他们得到固定的大小)。 下面是我的代码:
已经建立了一个小的测试SWING应用程序,有三个面板。一个主JPanel,包含两个较小的JPanel。一个在左边(板面板),另一个在右边(侧板)。通过调用min、preferred和max size方法,两个内部面板都被设置为请求的特定大小。右面板中的一个按钮将父JFrame设置为not re-sizable。在父帧设置为不可调整大小之前,一切看起来都很好,这会导致(?!)调整框架和主面板的大小,
问题内容: 我一直试图(徒劳地)建立一个页面,当我更改窗口大小时,其元素将重新调整大小。我可以在CSS中使用它来处理图像,但是没有问题,但是我似乎无法在文本上完成相同的操作,而且我不确定在CSS中是否有可能。而且我似乎找不到能完成此任务的jQuery脚本。 当用户调整窗口大小时,我实质上希望页面能够动态流畅地缩放,而无需用户调用页面缩放。通过css在我的img div上这可以正常工作,但对于文本则
问题内容: 调整浏览器窗口大小时,有什么方法可以调整jqGrid的大小?我已经尝试过这里描述的方法,但是该技术在IE7中不起作用。 问题答案: 作为后续措施: 由于不可靠,本文中显示的先前代码最终被放弃了。我现在按照jqGrid文档的建议使用以下API函数调整网格大小: 为了进行实际的大小调整,将实现以下逻辑的函数绑定到窗口的resize事件: 使用其父级的clientWidth和(如果不可用)o
问题内容: 我正在用d3.js绘制散点图。借助以下问题: 获取屏幕,当前网页和浏览器窗口的大小 我正在使用此答案: 这样我就可以将图适合用户的窗口,如下所示: 现在,我希望在用户调整窗口大小时可以调整图的大小。 PS:我的代码中没有使用jQuery。 问题答案: 寻找“响应式SVG”,使SVG响应式非常简单,您不必再担心大小。 这是我的做法: 注意: SVG图像中的所有内容都会随窗口宽度缩放。这包
我有一个窗口与列表框,调整大小与彼此。我用网格来做这个。列表框下面有一排按钮,它们当前正在随着窗口移动和调整大小。我希望按钮保持原位,并在窗口和列表框调整大小时保持一致的大小(所以按钮总是保持在列表框的左下角)。 有简单的方法吗?我今天才开始使用Tkinter,所以我可能只是在文档中错过了它,或者可能只是在网格布局上感到困惑。 按钮设置如下: 我已经尝试了所有粘性组合,但那些不调整按钮大小的组合仍