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