1

私はEclipseで奇妙な問題に直面しており、多くの検索を行った後でも、この点に関してバグは見つかりませんでした. 私の問題は 、 FontMetrics Class の handle フィールドにあります。API はプラットフォームに依存しているため、私ができることはあまりありません。問題は次のようなものです。

draw2d ウィジェットと接続で作成されたいくつかの図を Word と PDF にエクスポートする必要があります。これまで、エクスポート機能は、ダイアグラムが描画されるエディタのツールバーへのアクションとして利用できました。それはうまくいっています。FigureCanvas を SWT 画像にペイントし、それをファイルに保存するだけです。私が利用できる API があり、それを Word/PDF に挿入します。今、私はそれをオフラインにする必要があります。つまり、実際に画面に図を描画する必要はありません。私はこれを達成するために次のようなことをしました:

Job job = new Job("Making DFD for " + data.getName()) {
        @SuppressWarnings("unchecked")
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            final Display display = new Display();
            final Shell shell = new Shell(display);
            shell.setLayout(new FillLayout());
            Composite composite = new Composite(shell, SWT.NONE);
            try {

                imageFolder = new File(tempFolder + IOUtils.FILE_SEPARATOR + 
                        "dfd-" + (new Date()).getTime());

                composite.setLayout(new FillLayout());
                final FigureCanvas canvas = new FigureCanvas(composite);
                ArrayList<DFDFigureData> figureData = renderer.getDfdFigureDatas();
                final DFDMaker3 dfdMaker;
                dfdMaker = new DFDMaker3(canvas, "", figureData, null, false);
                Logger.println("Shell Size:", shell.computeSize(-1, -1, true));
                display.syncExec(new Runnable(){
                    public void run() {
                        dfdMaker.makeDFD();
                        shell.setSize(-1, -1);
                        dfdMaker.selectNode(-1, display);
                    }
                });
                Logger.println("Shell Size:", shell.computeSize(-1, -1, true));

                /* Image Export Stuff Goes here */
                return Status.OK_STATUS;
            } catch (Exception e) {
                Logger.println("Error in DFD Creation Job", e.toString());
                return Status.CANCEL_STATUS;
            } finally {
                composite.dispose();
                shell.dispose();
                display.dispose();
            }
        }
    };
    job.setPriority(Job.SHORT);
    job.schedule();

これを初めて実行すると、両方の Log ステートメントが良いことを教えてくれます。


シェルサイズ::: ポイント {72, 98} シェルサイズ::: ポイント {1216, 524}


しかし、アプリケーションを閉じずに同じコードを 2 回実行すると、次のようになります。


シェルサイズ::: ポイント {72, 98} シェルサイズ::: ポイント {1216, 1945541082 }


シェルの高さの値が大きいと、すべてが台無しになります。激しいデバッグの後、私が使用している 2 回目の FlowPage が、Font の降下に対して間違った値を取得することがわかりました。メソッドFontMetrics.getDescent()はランダムな大きな値を返します。

これをどのように進めるべきか正確にはわかりません。最初に使用したすべてのリソースを破棄しました。Display、Shell、Composite、Canvas、さらには GC と SWTGraphics です。バグかどうか教えてもらえますか?そうでない場合、どうすればここで問題を見つけることができますか?

4

0 に答える 0