我目前正在学习JOGL,我试图编写一个程序,允许用户选择他要在窗口上绘制的形状类型。我已经找到了另一种解决方案,可以将各种形状放在不同的类中,而不是仅放在一个类中。然后询问用户要添加到GLJPanel中的形状。
但是我仍然想了解为什么会遇到此问题以及如何解决(除了上述问题)
主要: JOGL程序应该执行的一般工作,其中的println是用于调试的。
显示中:
-仅 display()中的“到过这里”在控制台中打印两次,可能证明显示方法被有效地调用了两次
-我尝试使用 showInputDialog 方法从 JOPtionPane 获取值。
-我试图设置一个布尔值' onetime ',以防止显示方法两次调用 JOptionPane ,但这不能解决问题
import java.awt.Color;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLJPanel;
import javax.swing.*;
public class Debug {
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
GLProfile p = GLProfile.get(GLProfile.GL2);
GLCapabilities c = new GLCapabilities(p);
GLJPanel gljp2 = new GLJPanel(c); //Remplacable par GLCanvas(c);
gljp2.setSize(800, 800);
gljp2.setBackground(Color.white);
System.out.println("SD0");
Shape shp = new Shape();
System.out.println("SD1");
gljp2.addGLEventListener(shp);
System.out.println("SD2");
do{
JFrame fen = new JFrame("Basic Frame");
shp.setOnetime(true);
fen.getContentPane().add(gljp2);
System.out.println("SD3");
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setSize(800, 800);
fen.setVisible(true);
}while("c".equals(JOptionPane.showInputDialog(null,"Type c to continue")));
}});
}
}
class Shape implements GLEventListener
{
private static boolean onetime = true;
private int choice;
@Override
public void init(GLAutoDrawable drawable) {
}
@Override
public void display(GLAutoDrawable drawable)
{
System.out.println("Has been here");
final GL2 gl = drawable.getGL().getGL2();
if(onetime)
{
choice = Integer.parseInt(JOptionPane.showInputDialog(null, "Choice :\n\t1>Line\n\t2>Triangle"));
onetime=false;
switch(choice)
{
case 1:
gl.glBegin(GL2.GL_LINES);
gl.glVertex3f(-0.50f, -0.50f, 0);
gl.glVertex3f(0.50f, 0.50f, 0);
gl.glEnd();
break;
case 2:
//drawing the base
gl.glBegin(GL2.GL_LINES);
gl.glVertex3f(-0.50f, -0.50f, 0);
gl.glVertex3f(0.50f, -0.50f, 0);
gl.glEnd();
//drawing the right edge
gl.glBegin(GL2.GL_LINES);
gl.glVertex3f(0f, 0.50f, 0);
gl.glVertex3f(-0.50f, -0.50f, 0);
gl.glEnd();
//drawing the lft edge
gl.glBegin(GL2.GL_LINES);
gl.glVertex3f(0f, 0.50f, 0);
gl.glVertex3f(0.50f, -0.50f, 0);
gl.glEnd();
gl.glFlush();
break;
default:
JOptionPane.showMessageDialog(null, "Entrée incorrecte, réessayez");
System.exit(1);
}
}
}
//Next is irrelevant (getter and setters) so I havent included it here
}