Multiple GLJPanels and GLJCanvases

Hello,

I found an example on the net where someone show how to create an application with two canvases with sharing the context.
The example , you can see it here:
http://www.cs.plu.edu/~dwolff/talks/jogl-ccsc/src/h_MultipleGLCanvases/MultipleGLCanvasesExample.java

It works fine and the code is clear :slight_smile:
Now on my problem, I’m developping a program and I would like to use a multiple GLJPanels and not GLCanvases. That because I’m using an JInternalFrame and GLCanvas can’t work with the internal frame.
So I tried to make the same example but with GJJPanel … but it doesn’t work good. When I’m trying to put the second GLJPanel, there is an exception…
This is my code:



import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.media.opengl.DebugGL;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLJPanel;
import javax.media.opengl.glu.GLU;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


import com.sun.opengl.util.FPSAnimator;



public class MultipleGLJPanelExample extends JFrame implements ActionListener {
	
	private static final long serialVersionUID = 0L;

	// The animator object
	private FPSAnimator anim1, anim2;
	
	// Frames per second
	private int fps = 30;
	
	// The rotation angle
	private double angle = 0.0;
	
	// Start and stop button
	private JButton startStopButton;
	
	// The ID for the shared display list
	private int cubeList;
	
	/*
	 * Start or stop both animators.
	 */
	public void actionPerformed( ActionEvent e ) 
	{
		if( startStopButton.getText() == "Start") 
		{
			anim1.start();
			//anim2.start();
			startStopButton.setText("Stop");
		}
		else if( startStopButton.getText() == "Stop") {
			anim1.stop();
			//anim2.stop();
			startStopButton.setText("Start");
		}
		
	}
	
	public MultipleGLJPanelExample() 
	{
		
		setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	
		
		GLJPanel mainPanel = new GLJPanel(); // this is like in the original code : mainPanel contains the 2 others panels 1 and 2
                                                                                           //when I'm using this panel here, the panel1 appears too small, and when I don't it appears fine ... I don't know why :(
                                                                                           //this is another one of my problems with this application
		
		GLJPanel panel1 = new GLJPanel();
		panel1.setSize(200, 200);
		panel1.addGLEventListener(new Panel1Listener());
		mainPanel.add(panel1);
		panel1.requestFocus();
		anim1 = new FPSAnimator(panel1,fps);
		anim1.start();

		
		//here I'm trying to put the second JPanel
		/*
		GLJPanel panel2 = new GLJPanel(null,null,panel1.getContext()); // and here I have the exception, compile the code and you'll see it
		panel2.setSize(200,200);
		panel2.addGLEventListener(new Panel2Listener());
		mainPanel.add(panel2);
		panel1.requestFocus();
		anim2 = new FPSAnimator(panel2,fps);
		anim2.start();
		*/
		
		JPanel buttonPanel = new JPanel(); 
		buttonPanel.add( startStopButton = new JButton("Stop"));
		startStopButton.addActionListener(this);
		getContentPane().add( buttonPanel, BorderLayout.SOUTH );
		
		getContentPane().add( mainPanel, BorderLayout.CENTER );
		
		
		setSize(600,600);
		setVisible( true );
	}
	
	private class Panel1Listener implements GLEventListener 
	{
		// Cube data
		private float[][] cubeData = { {-0.5f, -0.5f, 0.5f}, {0.5f, -0.5f, 0.5f},
				{0.5f, 0.5f, 0.5f}, {-0.5f, 0.5f, 0.5f}, {-0.5f, -0.5f, -0.5f}, 
				{0.5f, -0.5f, -0.5f}, {0.5f, 0.5f, -0.5f}, {-0.5f, 0.5f, -0.5f}
		};
		
		private GLU glu = new GLU();
		
		public void init( GLAutoDrawable d ) { 
			GL gl = d.getGL();
			gl.glClearColor( 0,0,0,0 );
			
			float[] lightAmbient = {0.4f, 0.4f, 0.4f, 1.0f};
			float[] lightDiffuse = {0.8f, 0.8f, 0.8f, 1.0f};
			float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
			float[] lightPosition = {0.0f, 0.0f, 10.0f, 1.0f}; 
			
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, lightAmbient,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, lightDiffuse,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, lightSpecular,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightPosition,0);
			
			gl.glEnable(GL.GL_DEPTH_TEST);
			gl.glEnable(GL.GL_LIGHT0);
			gl.glEnable(GL.GL_LIGHTING);
			
			gl.glCullFace(GL.GL_BACK);
			gl.glEnable(GL.GL_CULL_FACE);
			gl.glMatrixMode( GL.GL_MODELVIEW );
			gl.glLoadIdentity();
			
			// Create the cube display list
			cubeList = gl.glGenLists(1);
			gl.glNewList(cubeList, GL.GL_COMPILE);
			drawCube(gl);
			gl.glEndList();
		}
		
		public void reshape( GLAutoDrawable d, int x, int y, int width, int height ) { 
			GL gl = d.getGL();
			gl.glMatrixMode( GL.GL_PROJECTION );
			gl.glLoadIdentity();
			glu.gluPerspective(60.0, (float)width/height, 0.5, 100.0);
			gl.glMatrixMode( GL.GL_MODELVIEW );
		}
		
		/* 
		 * Draw the scene.
		 */
		public void display( GLAutoDrawable d ) { 

			angle += 1.0;
			if( angle > 180.0 ) angle -= 360.0;
			
			// Draw the frame
			GL gl = d.getGL();
			gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
			gl.glLoadIdentity();
			glu.gluLookAt(0,2.0,2.0,0,1.0,0,0,1,0);
			drawFloor(gl,true);
			gl.glTranslated(0,1,0);
			gl.glRotated(angle,0.5,0.5,-0.5);
			gl.glCallList(cubeList);
		}
		
		private void drawCube(GL gl)
		{
			gl.glBegin(GL.GL_QUADS);
				// Front face
				gl.glNormal3f(0,0,1.0f);
				
				gl.glVertex3fv(cubeData[0],0);
				gl.glVertex3fv(cubeData[1],0);
				gl.glVertex3fv(cubeData[2],0);
				gl.glVertex3fv(cubeData[3],0);
				// Back face	
				gl.glNormal3f(0,0,-1.0f);
				gl.glVertex3fv(cubeData[5],0);
				gl.glVertex3fv(cubeData[4],0);
				gl.glVertex3fv(cubeData[7],0);
				gl.glVertex3fv(cubeData[6],0);
				// Top face
				gl.glNormal3f(0,1.0f,0.0f);
				gl.glVertex3fv(cubeData[3],0);
				gl.glVertex3fv(cubeData[2],0);
				gl.glVertex3fv(cubeData[6],0);
				gl.glVertex3fv(cubeData[7],0);
			gl.glEnd();
			
			gl.glBegin(GL.GL_QUADS);
				// Left face
				gl.glNormal3f(-1.0f, 0.0f,0.0f);
				gl.glVertex3fv(cubeData[4],0);
				gl.glVertex3fv(cubeData[0],0);
				gl.glVertex3fv(cubeData[3],0);
				gl.glVertex3fv(cubeData[7],0);
				// Right face
				gl.glNormal3f(1.0f,0.0f,0.0f);
				gl.glVertex3fv(cubeData[1],0);
				gl.glVertex3fv(cubeData[5],0);
				gl.glVertex3fv(cubeData[6],0);
				gl.glVertex3fv(cubeData[2],0);
				// Bottom face
				gl.glNormal3f(0,-1.0f,0.0f);
				gl.glVertex3fv(cubeData[4],0);
				gl.glVertex3fv(cubeData[5],0);
				gl.glVertex3fv(cubeData[1],0);
				gl.glVertex3fv(cubeData[0],0);
			gl.glEnd();
		}

		public void displayChanged( GLAutoDrawable d, boolean modeChanged, 
			boolean deviceChanged ) { }

	}
	
	private class Panel2Listener implements GLEventListener
	{		
		
		private GLU glu = new GLU();
		
		public void init( GLAutoDrawable d ) { 
			d.setGL(new DebugGL(d.getGL()));
			GL gl = d.getGL();
			gl.glClearColor( 0,0,0,0 );
			
			float[] lightAmbient = {0.4f, 0.4f, 0.4f, 1.0f};
			float[] lightDiffuse = {0.8f, 0.8f, 0.8f, 1.0f};
			float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
			float[] lightPosition = {0.0f, 0.0f, 10.0f, 1.0f}; 
			
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, lightAmbient,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, lightDiffuse,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, lightSpecular,0);
			gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, lightPosition,0);
			
			gl.glEnable(GL.GL_DEPTH_TEST);
			gl.glEnable(GL.GL_LIGHT0);
			gl.glEnable(GL.GL_LIGHTING);
		
			gl.glCullFace(GL.GL_BACK);
			gl.glEnable(GL.GL_CULL_FACE);
			gl.glMatrixMode( GL.GL_MODELVIEW );
			gl.glLoadIdentity();			
		}
		
		public void reshape( GLAutoDrawable d, int x, int y, int width, int height ) { 
			GL gl = d.getGL();
			gl.glMatrixMode( GL.GL_PROJECTION );
			gl.glLoadIdentity();
			glu.gluPerspective(60.0, (float)width/height, 0.5, 100.0);
			gl.glMatrixMode( GL.GL_MODELVIEW );
		}
		
		public void display( GLAutoDrawable d ) { 		
			// Draw the frame
			GL gl = d.getGL();
			gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
			gl.glLoadIdentity();
			glu.gluLookAt(10.5,10.5,10.5,0,1,0,0,1,0);
			drawFloor(gl,true);
			gl.glTranslated(0,1,0);
			gl.glRotated(angle,0.5,0.5,-0.5);
			gl.glCallList(cubeList);
		}

		public void displayChanged( GLAutoDrawable d, boolean modeChanged, 
			boolean deviceChanged ) { }
		
	}
	
	private void drawFloor(GL gl, boolean wireframe) {
		int xdivs = 50;
		int zdivs = 50;
		double xmin = -10.0, xmax = 10.0;
		double zmin = -10.0, zmax = 10.0;
		double x1, x2, y = 0.0, z;
		double xsize = (xmax - xmin) / xdivs;
		double zsize = (zmax - zmin) / zdivs;
		
		if( wireframe ) {
			gl.glPushAttrib(GL.GL_LIGHTING_BIT | GL.GL_POLYGON_BIT
					| GL.GL_COLOR_BUFFER_BIT | GL.GL_TEXTURE_BIT);
			gl.glDisable(GL.GL_LIGHTING);
			gl.glDisable(GL.GL_TEXTURE_2D);
			gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE);
			gl.glColor3f(1.0f,0.2f,0.2f);
		}
		
		for( int i = 0; i < xdivs ; i++ ) {
			x1 = (i * xsize) + xmin;
			x2 = ((i+1) * xsize) + xmin;
			
			gl.glBegin(GL.GL_QUAD_STRIP);
			for(int j = 0; j <= zdivs; j++) {
				z = (j * zsize) + zmin;
				gl.glVertex3d(x2,y,z);
				gl.glVertex3d(x1,y,z);
			}
			gl.glEnd();
		}
		
		if(wireframe) {
			gl.glPopAttrib();
		}
	}
	
	public static void main( String[] args ) {

		new MultipleGLJPanelExample();
	}

}


Any ideas ?

Regards,

Anton