Возникла проблема с отрисовкой сцены на Swing-овском компоненте. Вот накидал небольшой примерчик: Код JFrame. На него кладется панель а уже на неё Render, наследуемый от GLCanvas | Код | import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JFrame;
public class MyFrame extends JFrame {
private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private Render render = null;
/** * This is the default constructor */ public MyFrame() { super(); render = new Render(); initialize(); }
/** * This method initializes this * * @return void */ private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
/** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); jContentPane.add(render); } return jContentPane; }
public static void main(String[] args ){ MyFrame frame = new MyFrame(); frame.setVisible(true); } }
|
В этом классе рендерится вся сцена: | Код | import java.awt.Graphics;
import javax.media.opengl.GL; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLEventListener; import javax.media.opengl.glu.GLU;
import com.sun.opengl.util.GLUT;
public class Render extends GLCanvas implements GLEventListener {
GLUT glut = null; GLU glu = null; public Render() { // TODO Auto-generated constructor stub setSize(300,200); addGLEventListener(this); glut = new GLUT(); glu = new GLU(); } @Override public void display(GLAutoDrawable arg0) { // TODO Auto-generated method stub GL gl = arg0.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT); gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0.0f, 0.0f, -5.0f); gl.glColor3f(0.0f, 1.0f, 0.0f); glut.glutWireTeapot(1.0f); gl.glFlush(); }
@Override public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) { // TODO Auto-generated method stub }
@Override public void init(GLAutoDrawable arg0) { GL gl = arg0.getGL(); gl.glClearColor(1.0f, 1.0f, 1.0f, 0f); }
@Override public void reshape(GLAutoDrawable glDrawable, int x, int y, int width, int height) { final GL gl = glDrawable.getGL();
if (height <= 0) // avoid a divide by zero error! height = 1; final float h = (float) width / (float) height; gl.glViewport(0, 0, width, height); gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(45.0f, h, 1.0, 20.0); }
@Override public void paint(Graphics graphics) { // TODO Auto-generated method stub //super.paint(arg0); display(); } @Override public void update(Graphics graphics) { // TODO Auto-generated method stub //super.update(arg0); paint(graphics); } }
|
Вообщем проблема состоит в том, что сцена не всегда прорисовывается!!! При изменении положении окна, его размеров, перекрытии его другим окном, сцена когда прорисовывается а когда и нет, а вместо неё всё заливается серым цветом(фоном JPanel). Причем такая проблема возникает только тогда, когда Java приложение запущено не из под среды (через jar или bat -ник в Windows). Когда запускаю из под среды (в Эклипсе) отрисовывается всё нормально. В чём может быть дело?
|