gpt4 book ai didi

java - Swing 和 AWT GLCanvas 闪烁/闪烁

转载 作者:行者123 更新时间:2023-11-29 04:55:15 30 4
gpt4 key购买 nike

我正在使用 Swing 创建组件并使用 GLCanvas (com.jogamp.opengl.awt.GLCanvas) 创建我的窗口。

接下来就是问题了

在初始状态下,一切正常,但是当我拖动窗口调整它的大小时,包含我的 GLCanvas 的 JPanel 开始闪烁/闪烁。

阅读其他主题,我试试flagSystem.setProperty("sun.awt.noerasebackground", "true");但它不起作用。

从 GLCanvas 我的类扩展的覆盖方法 Init。

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();

}

显示方式:

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();
}

和 Reshape 方法:

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;
}

有人知道解决办法吗?

谢谢你的时间

我将 GL2 与 JOGAMP 库一起使用

最佳答案

如果可能,您应该在命令行中设置属性 sun.awt.noerasebackground,当然要早些。但是,由于 AWT 中的回归,此解决方法不再有效,有一个针对 JOGL 的错误报告,但它无法在 JOGL 中修复:https://jogamp.org/bugzilla/show_bug.cgi?id=1182

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

请更准确地说明您的硬件、操作系统、Java 版本、JOGL 版本(2.3.2?)...

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

关于java - Swing 和 AWT GLCanvas 闪烁/闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041654/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com