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. Может кто-нибудь сказать мне, если это ошибка? Если нет, есть идеи, как я могу найти проблему здесь?

0 ответов

Другие вопросы по тегам