我在 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。谁能告诉我它是否是一个错误?如果没有,知道如何在这里找到问题吗?