FontMetrics возвращает спуск мусорного шрифта
Я столкнулся со странной проблемой в Eclipse, и даже после долгих поисков я не нашел ошибок и в этом отношении. Моя проблема с полем дескриптора в классе FontMetrics. Поскольку 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}
Большое значение высоты оболочки все портит. После интенсивной отладки я обнаружил, что второй раз, FlowPage, который я использую, получает неправильное значение для спуска шрифта. Метод FontMetrics.getDescent() возвращает случайное большое значение.
Я не уверен, как именно поступить в этом. Я распорядился всеми ресурсами, которые использовал в первый раз. Дисплей, оболочка, композит, холст и даже GC и SWTGraphics. Может кто-нибудь сказать мне, если это ошибка? Если нет, есть идеи, как я могу найти проблему здесь?