2

私は現在、SWTとEclipseのWindowBuilderを使用してスタンドアロンアプリケーション(Eclipseプラグインではない)を作成しており、画像をコンポジットに簡単に配置する方法として使用するために、コンポジットに画像を配置することをテストしていました。画像の場合、IllegalArgumentExceptionがスローされます。何が起こっているのかわかりません。説明/代替案を探しています。何が起こっているのでしょうか。これを修正するにはどうすればよいですか。

私がその行をコメントアウトし、e.gc.drawImageそれ以上何もしなければ、例外はスローされません。

エラーが発生するコードは次のとおりです。

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class GUI {
    public static final Display display = Display.getDefault();;
    private final Shell shell;

    public GUI() {
        shell = new Shell(display);
        shell.setLayout(new FillLayout(SWT.HORIZONTAL));
    }

    public static void main(String[] args) {
        GUI window = new GUI();
        window.open();
    }

    public void open() {
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    private void createContents() {
        shell.setSize(450, 300);

        ImageTest img = new ImageTest(shell, SWT.NONE);
    }
}

import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Canvas;

public class ImageTest extends Composite {
    public ImageTest(Composite parent, int style) {
        super(parent, style);
        setLayout(new FillLayout(SWT.HORIZONTAL));

        final Image img = new Image(GUI.display, "img.gif");

            // I tried drawing the image to both a canvas and the composite its self. Same outcome.
        Canvas canvas = new Canvas(this, SWT.NONE);
        canvas.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                e.gc.drawImage(img, 0, 0); // If I comment this out, it runs fine.
            }
        });

        img.dispose();
    }

    @Override
    protected void checkSubclass() {}
}

どんな助けでもいただければ幸いです。

4

2 に答える 2

3

paintControl が画像を描画しようとすると画像が破棄されるため、エラーが発生します。ImageTestペイント リスナーが呼び出される前に、コンストラクターの最後で自分で破棄します。

imgクラスのメンバー変数を作成し、dispose メソッドをオーバーライドしてクリーンアップを行うことで、これを回避できます。

@Override
public void dispose() {
    this.img.dispose();
    super.dispose();
}

行を削除することを忘れないでください

img.dispose();

あなたのコンストラクタから。

于 2012-12-30T15:07:52.843 に答える
1

GC.drawImage API ドキュメントによると、次の場合に IllegalArgumentException がスローされます。画像オブジェクトが null である可能性があります。

IllegalArgumentException -
ERROR_NULL_ARGUMENT - if the image is null
ERROR_INVALID_ARGUMENT - if the image has been disposed
ERROR_INVALID_ARGUMENT - if the given coordinates are outside the bounds of the image
于 2012-12-30T15:06:25.227 に答える