首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing和AWT GLCanvas闪烁/闪烁

Swing和AWT GLCanvas闪烁/闪烁
EN

Stack Overflow用户
提问于 2015-12-02 11:29:43
回答 1查看 373关注 0票数 1

我使用Swing创建组件,使用GLCanvas (com.jogamp.opengl.awt.GLCanvas)创建窗口。

问题是下一个问题。

在init状态下,所有操作都很好,但是当我拖动窗口调整其大小时,包含我的JPanel的GLCanvas开始闪烁/闪烁。

阅读其他主题后,我尝试使用System.setProperty("sun.awt.noerasebackground",标志“true”),但它不起作用。

从GLCanvas my类扩展的重写方法Init。

代码语言:javascript
复制
public void init(GLAutoDrawable drawable) {

    this.drawable=drawable;
    gl = drawable.getGL().getGL2();
    //glu = new GLU();
    //glut = new GLUT();
    gl.setSwapInterval(1);
    gl.glClearColor(getClearColor().getRed(),getClearColor().getGreen(),getClearColor().getBlue(), 1.0f);
//*******************************
SetDefaultGLproperty();
System.setProperty("sun.awt.noerasebackground", "true");
System.out.println("PROPERTY ACTIVATE");
//SetDefaultLigthModel();

}

显示方法:

代码语言:javascript
复制
public void display(GLAutoDrawable drawable) {
  try{  
    //System.out.println("display de jcadcanvas");
    //gestion de la vista
    if (Scene.view.isSelectionMode || Scene.view.isMouseOver){
        //System.out.println("entra");
     startPicking( Scene.view.curX,Scene.view.curY);
     gl.glMultMatrixf(Scene.view.trackball.getRotMatrix(), 0);
     if (Scene!=null) Scene.DrawSceneInSelectionMode(gl);
     int r=endPicking(gl);
    if (r!=0) {
       if (Scene.view.isSelectionMode) {
           //System.out.println("select");
             Scene.selectionModel.addSelectedEntity(r);
             //isSelectionMode=false;
               } else
       if (Scene.view.isMouseOver) {
             Scene.selectionModel.setMouseOverEntity(r);
             //isMouseOver=false;
               }
     }

     //isMouseOver=false;
    }
    Scene.view.isSelectionMode=false;
     Scene.view.isMouseOver=false;
    //else { //*/*************************************



    if (Scene.view.fitView) {
        ZoomAll();
        Scene.view.fitView=false;
    } else
        SetOrthoProjection(Scene.view.leftViewVolume, Scene.view.rightViewVolume, Scene.view.bottomViewVolume, Scene.view.topViewVolume, Scene.view.nearViewVolume, Scene.view.farViewVolume);
    //System.out.println(Scene.leftViewVolume+" "+Scene.rightViewVolume+" "+Scene.bottomViewVolume+" "+ Scene.topViewVolume+" "+ Scene.nearViewVolume+" "+ Scene.farViewVolume);
     gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

    if (Scene.view.isZoomBox) DrawZoomBox() ;  ///caja de zoom
    gl.glMultMatrixf(Scene.view.trackball.getRotMatrix(), 0);
 /*
   if (!Scene.getSelectedNode().isEmpty()){
    JAbstractEntity centro=(JAbstractEntity)Scene.getSelectedNode().get(0);
    JPoint p=centro.getCentroid();
    gl.glTranslated(-p.x, -p.y,-p.z);
   }
  * */
    if (isDrawaxes()) {
        DrawAxes(gl);
    }
    if (Scene!=null) Scene.DrawScene(gl);
    //}

  } catch(com.jogamp.opengl.GLException e){

  }catch(java.util.ConcurrentModificationException e){

  }

  if (save) save();
}

重塑方法:

代码语言:javascript
复制
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
    //AQUI ESTA EL PROBLEMA DEL RESHAPE
    System.out.println(width+"entro"+height);
    double left = Scene.view.leftViewVolume;
    double right = Scene.view.rightViewVolume;
    double bottom = Scene.view.bottomViewVolume;
    double top = Scene.view.topViewVolume;
    if (width != aWidth) {
        System.out.println("ancho");
        double magnitud = ((Scene.view.rightViewVolume - Scene.view.leftViewVolume) * (double) height) / (double) width;
        magnitud = ((Scene.view.topViewVolume - Scene.view.bottomViewVolume) - magnitud) / 2.0;
        left = Scene.view.leftViewVolume;
        right = Scene.view.rightViewVolume;
        //bottom=topViewVolume-magnitud;
        bottom = Scene.view.bottomViewVolume + magnitud;
        top = Scene.view.topViewVolume - magnitud;
    } else if (height != aHeight) {
            System.out.println("alto");
        double magnitud = ((Scene.view.topViewVolume - Scene.view.bottomViewVolume) * (double) width) / (double) height;
        magnitud = ((Scene.view.rightViewVolume - Scene.view.leftViewVolume) - magnitud) / 2.0;
        left = Scene.view.leftViewVolume + magnitud;
        right = Scene.view.rightViewVolume - magnitud;
        bottom = Scene.view.bottomViewVolume;
        top = Scene.view.topViewVolume;
    }

    aHeight = height;
    aWidth = width;
    //System.out.println (aHeight+" "+aWidth);
    //System.out.println (width +" "+height);
    gl.glViewport(0, 0, width, height);
    SetOrthoProjectionIsotropic(left, right, bottom, top, Scene.view.nearViewVolume, Scene.view.farViewVolume);
    //fitView=true;
}

有人知道解决办法吗?

耽误您时间,实在对不起

我在JOGAMP库中使用GL2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-02 16:03:36

如果可能的话,您应该在命令行中设置属性sun.awt.noerasebackground。但是,由于AWT中的回归,这个解决方案不再起作用,有一个针对JOGL的错误报告,但是它不能在JOGL:bug.cgi?id=1182中修复。

您可以尝试将GLCanvas替换为GLJPanel,但我不确定您是否会获得更好的结果。

请对您的硬件、操作系统、Java版本、JOGL版本(2.3.2?)、.

顺便说一句,如果您想避免捕获一些GLU.createGLU实例,请将glu = new ()替换为GLU.createGLU(gl)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34041654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档