Hi, everyone !
Here’s a simple sandbox example of this bug. Clicking on the glcanvas should create a new tab with the same thing drawn. Instead, on Mac OS X Panther, I’m getting an “invalid drawable” error.
Here’s the code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import net.java.games.jogl.GL;
import net.java.games.jogl.GLCanvas;
import net.java.games.jogl.GLCapabilities;
import net.java.games.jogl.GLDrawable;
import net.java.games.jogl.GLDrawableFactory;
import net.java.games.jogl.GLEventListener;
import net.java.games.jogl.GLU;
public class InvalidDrawableSandbox extends JFrame implements GLEventListener, MouseListener
{
public static final Dimension PREFERRED_FRAME_SIZE = new Dimension (450,375);
JTabbedPane jtp;
int tabIndex = 0;
public InvalidDrawableSandbox()
{
super ("Invalid Drawable Sandbox");
// put the panel inside a JTabbedPane
jtp = new JTabbedPane ();
jtp.add(makeNewPanel (), "Canvas #" + tabIndex);
this.getContentPane().add(jtp, BorderLayout.CENTER);
}
JPanel makeNewPanel ()
{
// put the new canvas inside a JPanel
JPanel jp = new JPanel ();
GLCapabilities capabilities = new GLCapabilities();
GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(capabilities);
canvas.addGLEventListener(this);
canvas.addMouseListener(this);
jp.setLayout(new BorderLayout());
jp.add (canvas, BorderLayout.CENTER);
tabIndex++;
return jp;
}
public Dimension getPreferredSize ()
{
return PREFERRED_FRAME_SIZE;
}
public static void main (String[] args)
{
InvalidDrawableSandbox f = new InvalidDrawableSandbox();
f.pack();
f.show();
}
public void displayChanged (GLDrawable drawable, boolean b1, boolean b2) {}
public void display (GLDrawable drawable)
{
GL gl = drawable.getGL();
GLU glu = drawable.getGLU();
gl.glClear (GL.GL_COLOR_BUFFER_BIT);
drawFilledRect (gl, Color.cyan.darker());
}
// Called after OpenGL is init'ed
public void init (GLDrawable drawable)
{
GL gl = drawable.getGL();
gl.glClearColor( 0.80f, 1.0f, 0.8f, 1.0f ); //white
gl.glColor3f( 0.0f, 0.2f, 0.0f );
//gl.glPointSize(4.0f);
}
public void reshape (GLDrawable drawable, int x, int y, int width, int height)
{
GL gl = drawable.getGL();
GLU glu = drawable.getGLU();
gl.glViewport( 0, 0, width, height );
gl.glMatrixMode( GL.GL_PROJECTION );
gl.glLoadIdentity();
glu.gluOrtho2D( 0.0, 450.0, 0.0, 375.0);
}
protected void drawFilledRect (GL gl, Color c)
{
float redF = c.getRed() / 255f;
float greenF = c.getGreen() / 255f;
float blueF = c.getBlue() / 255f;
gl.glColor3f (redF, greenF, blueF);
gl.glRecti (200, 50, 250, 150);
// now reset the color to black
gl.glColor3f (0.0f, 0.0f, 0.0f);
}
// mouse listener implementation
public void mousePressed(MouseEvent e)
{
jtp.add(makeNewPanel (), "Canvas #" + tabIndex);
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
}
I would appreciate any suggestions.
Thanks,
Andrei