为什么JOGL-SWT GLCanvas仅在调整Shell大小时显示?

时间:2017-09-29 23:20:02

标签: swt jogl

我有一个基于SWT的JOGL 2D图表测试,有四个GLCanvas:图例,底轴,左轴和系列。该组件嵌入在SWT Shell中,并定期从具有生成的"信号"的线程更新。

以下是shell的屏幕截图:

Shell freshly created

如您所见,图例,左轴和系列区域已正确更新,但在创建外壳后底部轴不可见,并且必须调整此外壳的大小以便最终显示底部轴:

Shell resized

以下是显示底部轴(文本)的代码:

bottomAxisAreaGLContext.getGL().getGL2().glColor3f(fontColor.getRed() / 255, fontColor.getGreen() / 255, fontColor.getBlue() / 255);
for (int i = 0; i < verticalGridLinesPositions.size(); i++) {
        int position = verticalGridLinesPositions.get(i).intValue();
        double value = (i + 1) * (windowTimeWidth) / (verticalGridLinesPositions.size() + 1);
        String valueString = decimalFormatter.format(value).replaceAll("E0$", "");
        int valueStringLength = glut.glutBitmapLength(getFontNumber(), valueString);
        bottomAxisAreaGLContext.getGL().getGL2().glRasterPos3f(position - valueStringLength / 2, getBottomAxisHeight() / 2 - getFontHeight() / 2, 0);
        glut.glutBitmapString(getFontNumber(), valueString);
}

使用类似的方法显示左轴。

我不明白为什么必须调整Shell的大小才能显示底部轴。

为什么它适用于所有其他GLCanvas而不适用于底轴GLCanvas?

请问好吗?

1 个答案:

答案 0 :(得分:0)

确保更新Shell的Thread具有以下结构:

new Thread() {
            public void run() {

                //your logic...

                display.asyncExec(new Runnable() {
                        public void run() {
                            if (shell.isDisposed())
                                return;
                            shell.redraw();
                        }
                    });
            }
        }.start();