1

我在 Eclipse 中遇到了一个奇怪的问题,即使经过大量搜索,在这方面也没有发现任何错误。我的问题是 FontMetrics Class 中的句柄字段。由于 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}


但是当我第二次运行相同的代码时,没有关闭应用程序,我得到:


外壳尺寸::: 点 {72, 98} 外壳尺寸::: 点 {1216, 1945541082 }


外壳的大高度值破坏了一切。经过激烈的调试,我发现第二次使用的 FlowPage 得到了错误的 Font 下降值。FontMetrics.getDescent()方法返回一个随机大值。

我不确定该如何进行。我已经处置了我第一次使用的所有资源。Display、Shell、Composite、Canvas,甚至 GC 和 SWTGraphics。谁能告诉我它是否是一个错误?如果没有,知道如何在这里找到问题吗?

4

0 回答 0