Multiple Canvas In Same JFrame
Posted by garrydias on Aug 30, 2015; 3:39am
URL: https://forum.jogamp.org/Multiple-Canvas-In-Same-JFrame-tp4035177.html
Could someone explain why the code below does not print in console?
canvasName=canvas1
canvasName=canvas2
But is printing:
canvasName=canvas2
That´s the code:
public class JOGL2Setup_GLCanvas extends GLCanvas implements GLEventListener {
private static String TITLE = "JOGL 2.0 Setup (GLCanvas)";
private static final int CANVAS_WIDTH = 640;
private static final int CANVAS_HEIGHT = 480;
private static final int FPS = 60;
private String canvasName;
public JOGL2Setup_GLCanvas(String canvasName) {
this();
this.canvasName = canvasName;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Create my two OpenGL Canvas
GLCanvas upperCanvas = new JOGL2Setup_GLCanvas("upperCanvas");
GLCanvas lowerCanvas = new JOGL2Setup_GLCanvas("lowerCanvas");
upperCanvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
lowerCanvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
final FPSAnimator upperCanvasAnimator = new FPSAnimator(upperCanvas, FPS, true);
final FPSAnimator lowerCanvasAnimator = new FPSAnimator(lowerCanvas, FPS, true);
final JFrame frame = new JFrame();
// Adding the canvases. Will be drawn one above the other because I just want to print messages in console.
frame.getContentPane().add(upperCanvas);
frame.getContentPane().add(lowerCanvas);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
new Thread() {
@Override
public void run() {
// stop the world
if (upperCanvasAnimator.isStarted() || lowerCanvasAnimator.isStarted()){
upperCanvasAnimator.stop();
lowerCanvasAnimator.stop();
}
System.exit(0);
}
}.start();
}
});
frame.setTitle(TITLE);
frame.pack();
frame.setVisible(true);
// Should start my two canvas
upperCanvasAnimator.start();// Should call init method for upperCanvas, am I right?
lowerCanvasAnimator.start();// Should call init method for lowerCanvas, am I right?
}
});
}
private GLU glu; // for the GL Utility
public JOGL2Setup_GLCanvas() {
this.addGLEventListener(this);
}
public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
glu = new GLU();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL_DEPTH_TEST);
gl.glDepthFunc(GL_LEQUAL);
gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
gl.glShadeModel(GL_SMOOTH);
// ....
}
// Should be called twice, am I right? One for upperCanvas and one for lowerCanvas? But is called once =(
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL2 gl = drawable.getGL().getGL2();
if (height == 0) height = 1;
float aspect = (float)width / height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0, aspect, 0.1, 100.0);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
System.out.println(drawable);
}
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f, -6.0f);
gl.glBegin(GL_TRIANGLES);
gl.glVertex3f(0.0f, 1.0f, 0.0f);
gl.glVertex3f(-1.0f, -1.0f, 0.0f);
gl.glVertex3f(1.0f, -1.0f, 0.0f);
gl.glEnd();
}
public void dispose(GLAutoDrawable drawable) { }
@Override
public String toString() {
return "canvasName="+this.canvasName;
}
}