【发布时间】:2013-09-18 11:58:21
【问题描述】:
我的窗口 (SWT) 中有以下 UI 布局:
- 壳牌
- TabFolder(填充布局)
- 复合(行布局(水平)
- 组(行布局,垂直)
- 标签
- 标签
- 文字(宽度:450)
- 按钮
- 组(行布局,垂直)
- 标签
- 标签
- 画布(这就是问题所在)
- 组(行布局,垂直)
所有的 RowLayouts 都有以下属性:
wrap = true, justify = true, pack = true, marginLeft = 0
我遇到的问题是,如果我尝试将任何 Image 设置为 canvas (在调用 paint 事件时使用 event.gc.drawImage(0,0) 绘制),它通常根本不会显示,即使调用绘画事件(我看到了System.out.println() 调用)。如果我设置一个 5pixel 的图像并最大化窗口,那么图像被绘制,但它也疯狂地调用绘画事件,并且图像不断闪烁。
我在设置图像后调整画布大小,使用:
canvas.setSize(img.getBounds().width, img.getBounds().width);
如果我删除它,那么闪烁和重复的paint 调用就会消失,但是我仍然无法显示大于 5x5 的图像,它们根本不显示。
这是怎么回事..?我应该切换到 GridLayout 吗?我基本上只想展示两组,每组都包含一个垂直的字段/画布列表。
用于处理图像显示的 ImgCanvas 类的代码:
public class ImgCanvas
{
private Canvas canvas;
private Image img;
private int lastImgHash = 0;
public ImgCanvas(Composite parent)
{
canvas = new Canvas(parent, SWT.NONE);
initCanvas();
}
public ImgCanvas(Composite parent, Image img)
{
canvas = new Canvas(parent, SWT.NONE);
setImage(img);
initCanvas();
}
public void setCanvas(Canvas canvas)
{
this.canvas = canvas;
this.initCanvas();
}
public void setImage(Image img)
{
if (this.img != null)
this.img.dispose();
this.img = img;
System.out.println("Set image: " + img.getBounds() + ", " + img.toString());
redraw();
}
public void redraw()
{
canvas.redraw();
}
protected void initCanvas()
{
System.out.println("Canvas started");
canvas.addPaintListener( getPaintListener() );
canvas.addDisposeListener( getDisposeListener() );
}
protected PaintListener getPaintListener()
{
return new PaintListener()
{
public void paintControl(PaintEvent e)
{
System.out.println("Painting");
if (img != null )
{
System.out.println("Img:" + img.getBounds() );
e.gc.drawImage(img, 0, 0);
//canvas.setSize(img.getBounds().width, img.getBounds().width);
//canvas.pack();
}
else
System.out.println("Img is null: " + img);
}
};
}
protected DisposeListener getDisposeListener()
{
return new DisposeListener()
{
@Override
public void widgetDisposed(DisposeEvent e)
{
System.out.println("Disposing");
if (img != null)
img.dispose();
}
};
}
}
这是通过以下方式设置的:
imgCanvas = new ImgCanvas(group2); //2nd group in the layout given above.
然后,在第 1 组按钮的点击处理程序(selectionHandler)中,完成以下操作:
public void widgetSelected(SelectionEvent e)
{
//get a screenshot of a particular screen region using Java.Awt.Robot.captureScreenRegion,
//convert the image into a SWT image, and try to show it:
Image screenshot = ImgUtility.getScreenShot(0,0,10,10);
imgCanvas.setImage(screenshot);
System.out.println("redrawn");
}
【问题讨论】:
-
您能添加有问题的代码吗?
-
好的,请不要添加代码。我建议,在创建画布时使用以下参数
objCanvas =new Canvas(parent, SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED); -
@ShishirPandey 我添加了一些代码...
-
@ShishirPandey 谢谢,现在闪烁消失了,但问题是图像根本没有显示,除非它的 5x5 像素并且我已经最大化了页面。
-
好的,谢谢你的代码。我试图在我的最后重现问题。我会在某个时候恢复。