ウィンドウ (SWT) に次の UI レイアウトがあります。
- シェル
- TabFolder (FillLayout)
- 複合 (RowLayout (水平)
- グループ (RowLayout、垂直)
- ラベル
- ラベル
- テキスト (幅: 450)
- ボタン
- グループ (RowLayout、垂直)
- ラベル
- ラベル
- キャンバス(これが問題です)
- グループ (RowLayout、垂直)
すべての RowLayouts には、次の属性があります。
wrap = true, justify = true, pack = true, marginLeft = 0
私が抱えている問題はImage
、 (イベントが呼び出さcanvas
れたときに描画されるように)を設定しようとすると、ペイントイベントが呼び出されても通常はまったく表示されないことです(呼び出しが表示されます)。5 ピクセルの画像を設定してウィンドウを最大化すると、画像が描画されますが、ペイント イベントも狂ったように呼び出され、画像は継続的にちらつきます。paint
event.gc.drawImage(0,0)
System.out.println()
次を使用して、画像が設定された後にキャンバスのサイズを変更しています。
canvas.setSize(img.getBounds().width, img.getBounds().width);
それを削除すると、ちらつきや繰り返しのpaint
呼び出しはなくなりますが、5x5 を超える画像を表示することはできず、まったく表示されません。
何が起きてる..?GridLayout に切り替える必要がありますか? 基本的には、2 つのグループを表示したいだけで、それぞれにフィールド/キャンバスの垂直リストが含まれます。
画像の表示を処理するために使用される私の 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");
}