我正在使用一个应用程序,我在其中添加了一个重量级(Canvas)到JFrame。 Canvas是第三方组件,因此我需要保持它的重量级。我想添加一些功能,供用户在画布上绘制并绘制一个选择矩形。
我不认为我可以用玻璃窗格做到这一点,因为重量级画布将显示在玻璃窗格上。我已经尝试将鼠标监听器添加到画布并直接在其图形上绘图,但这似乎给出了“闪烁”效果,因为它不是一个轻量级的双缓冲组件。
有没有办法在重量级组件上实现这种平滑的绘制?
这是我目前在重量级组件的paint方法中的尝试,但仍有闪烁。
@Override
public void paint(Graphics g)
{
super.paint(g);
if (showUserSelection)
{
Point startDrawPoint = new Point(Math.min(startSelectPoint.x,
endSelectPoint.x), Math.min(startSelectPoint.y,
endSelectPoint.y));
Point endDrawPoint = new Point(Math.max(startSelectPoint.x,
endSelectPoint.x), Math.max(startSelectPoint.y,
endSelectPoint.y));
int w = endDrawPoint.x - startDrawPoint.x;
int h = endDrawPoint.y - startDrawPoint.y;
if (w > 0 && h > 0)
{
BufferedImage img = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D imgGraphics = img.createGraphics();
imgGraphics.fillRect(0, 0, w, h);
g.drawImage(img, startDrawPoint.x, startDrawPoint.y, w, h,
null);
}
}
}
答案 0 :(得分:2)
我不知道“Swing中的Host AWT / SWT”组件有所下降,但你应该能够自己构建一个工作。
您是否考虑过自己实施双缓冲?
你的代码只有90%左右。只是一目了然。
@Override
public void paint(Graphics g)
{
BufferedImage buffer = new BufferedImage(COMPONENT_WIDTH, COMPONENT_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics bufferG = buffer.getGraphics();
super.paint(bufferG);
if (showUserSelection)
{
Point startDrawPoint = new Point(Math.min(startSelectPoint.x,
endSelectPoint.x), Math.min(startSelectPoint.y,
endSelectPoint.y));
Point endDrawPoint = new Point(Math.max(startSelectPoint.x,
endSelectPoint.x), Math.max(startSelectPoint.y,
endSelectPoint.y));
int w = endDrawPoint.x - startDrawPoint.x;
int h = endDrawPoint.y - startDrawPoint.y;
if (w > 0 && h > 0)
{
bufferG.fillRect(startDrawPoint.x, startDrawPoint.y, w, h);
}
}
g.drawImage(buffer, 0, 0, null);
}