看起来很奇怪,这是它应该工作的方式.
在幕后发生的事情是,当您创建的GLCanvas被绘制出来时,幕后JOGL正在做一大堆工作.它正在创建一个GLContext,并使其成为当前线程的GLCanvas的最新版本.只有在完成后才能进行渲染调用.尚未成为当前的GLContext或从中派生的GL对象对您没用.此外,GLContext仅为该线程设置为当前状态,并且在显示调用完成后立即变为非当前状态,因此挂起对它的引用或GL以供以后使用将不起作用.
几乎所有JOGL应用程序都以这种方式工作.您创建一个GLEventListener,并在其中实现display(),从GLAutoDrawable中提取GL并使用它来进行渲染调用.您不希望在任何其他位置进行渲染调用,只需要在paint()方法之外进行Graphics2D调用.大多数初学Java程序员都试图从paint方法之外进行绘制;这是类似的.如果你需要触发重绘,那么你就像使用Java2D一样:使用invalidate(). (您当然可以编写从display()方法调用的子方法,并将GL或GLAutoDrawable作为参数).
有一些方法可以让您专门创建GLContext并使其自己成为现实,但它们很少是必需的.在这里使用这种方法几乎总是更好.