我的窗口(SWT)中有以下UI布局:
所有RowLayouts都具有以下属性:
wrap = true, justify = true, pack = true, marginLeft = 0
我遇到的问题是,如果我尝试将Image
设置为canvas
(在调用paint
事件时绘制,请使用event.gc.drawImage(0,0)
),即使调用paint事件,它通常也不显示(我看到System.out.println()
调用)。如果我设置一个5像素的图像并最大化窗口,那么就会绘制图像,但它也会像疯了一样调用绘图事件,并且图像会不断闪烁。
我在设置图像后调整画布大小,使用:
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");
}
答案 0 :(得分:1)
demo.java
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import java.awt.Robot.*;
public class Demo {
static Spinner s;
public static void main(final String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
FillLayout layout= new FillLayout();
shell.setLayout(layout);
Composite comp=new Composite(shell, SWT.BORDER_DOT);
RowLayout r1=new RowLayout(SWT.HORIZONTAL);
r1.wrap=true;
r1.justify=true;
r1.pack=true;
r1.marginLeft=0;
RowLayout r2=new RowLayout(SWT.VERTICAL);
r2.wrap=true;
r2.justify=true;
r2.pack=true;
r2.marginLeft=0;
comp.setLayout(r1);
Group grp1;
grp1= new Group(comp,SWT.BORDER_DASH);
grp1.setLayout(r2);
Label l11,l22;
Text txt;
Button btn;
l11=new Label(grp1, SWT.NONE);
l11.setText("Label1");
l22=new Label(grp1, SWT.NONE);
l22.setText("Label2");
txt= new Text(grp1, SWT.BORDER);
btn= new Button(grp1, SWT.PUSH);
Group grp2;
Label l1,l2;
grp2= new Group(comp,SWT.BORDER);
grp2.setLayout(r2);
//grp2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
l1= new Label(grp2, SWT.NONE);
l1.setText("lable1");
l2= new Label(grp2, SWT.NONE);
l2.setText("lable1");
final ImgCanvas imgCanvas = new ImgCanvas(grp2);
//shell.redraw();
// shell.setSize(600, 600);
shell.open();
shell.layout();
btn.addSelectionListener(new SelectionListener() {
@Override
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 = new Image(display, "c:\\temp\\imgmsg.png");
imgCanvas.setImage(screenshot);
System.out.println("redrawn");
}
@Override
public void widgetDefaultSelected(SelectionEvent arg0) {
// TODO Auto-generated method stub
}
});
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
} }}
以下是ImgCanvas.Java
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
public class ImgCanvas
{
private Canvas canvas;
private Image img;
private int lastImgHash = 0;
public ImgCanvas(Composite parent)
{
canvas = new Canvas(parent, SWT.BORDER);
initCanvas();
}
public ImgCanvas(Composite parent, Image img)
{
canvas = new Canvas(parent, SWT.NONE);
// canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// canvas.layout();
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;
// canvas.pack();
// canvas.getParent().getParent().layout();
// canvas.getParent().getParent().getParent().layout();
canvas.getParent().setSize(img.getBounds().width,canvas.getParent().getSize().y);
canvas.setSize(img.getBounds().width, img.getBounds().height);
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();
}
};
}
}
答案 1 :(得分:0)
将Canvas
的布局数据设置为RowData
个实例,并将width
和height
字段设置为图片大小。