Jframe + Canvas: почему я получаю NullPointerException при звонке Glviewport? -- java поле с участием swing поле с участием opengl поле с участием awt поле с участием lwjgl пол Связанный проблема

JFrame + Canvas: why do I get a NUllPointerException when calling glViewport?


0
vote

проблема

русский

Я создал JFrame с холстом в нем, как вы можете видеть в коде ниже. То, что я пытаюсь сделать, это сделать контекст OpenGL, когда размер экрана обновляется. Это должно быть так же легко, как вызов GLViewport (), который я делаю в обработчике событий, называемых изменением размера (). Это, однако, приводит к этому:

 <код> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at org.lwjgl.opengl.GL11.glViewport(GL11.java:3199) at gltest.GameMain.resize(GameMain.java:149) at gltest.GameMain$1.componentResized(GameMain.java:59) (...)   

Я полностью невеженно. Границы, возвращаемые от размера холста, кажутся всеми, но как только я использую их в просмотре, они бросают ошибки. То же самое происходит, когда я вместо этого делаю звукозаписи «GLViewport (1, 1, 100, 100)». Все эти значения хорошо находятся в пределах окна, но все же он бросает очень же NullPointerexceptions, когда я изменил размер окна.

Я не знаю идеи и энергия, чтобы выяснить, почему (я прогуливался в течение 3 часов, без результата). Что я делаю не так?

 <код> import java.awt.Canvas; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;  import javax.swing.JFrame;  import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode;  import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.opengl.GL11.*;  public class GameMain {     public JFrame frame;     public Canvas canvas;      public boolean initialize(int width, int height) {         try {             Canvas canvas = new Canvas();             JFrame frame = new JFrame("Open Rock Raiders - Delta");             this.canvas = canvas;             this.frame = frame;             ComponentAdapter adapter = new ComponentAdapter() {                 public void componentResized(ComponentEvent e) {                     resize();                 }             };              canvas.addComponentListener(adapter);             canvas.setIgnoreRepaint(true);             frame.setSize(640, 480);             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             frame.getContentPane().add(canvas);             frame.setVisible(true);             Dimension dim = this.canvas.getSize();              Display.setLocation(100, 100);             Display.setTitle("GL Window");             Display.setDisplayMode(new DisplayMode(dim.width, dim.height));             Display.setParent(canvas);             Display.create();              //openGL setup             glViewport(0, 0, dim.width, dim.height);             glMatrixMode(GL_PROJECTION);             glLoadIdentity();             gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);             glMatrixMode(GL_MODELVIEW);             glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);             glClearDepth(1.0);             glShadeModel(GL_FLAT);             glEnable(GL_DEPTH_TEST);             glDepthFunc(GL_LEQUAL);             glEnable(GL11.GL_CULL_FACE);              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);             glEnable(GL_BLEND);             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);         } catch (LWJGLException le) {             le.printStackTrace();         }         return false;     }      public void resize()     {         Dimension dim = this.canvas.getSize();         GL11.glViewport(0, 0, dim.width, dim.height);     } }   
Английский оригинал

I have created a JFrame with a canvas in it, like you can see in the code below. What I am trying to do is to make the openGL context resize when the size of the screen gets updated. This should be as easy as a call to glViewport(), which I am doing in the event handler called resize(). That, however, results in this:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at org.lwjgl.opengl.GL11.glViewport(GL11.java:3199) at gltest.GameMain.resize(GameMain.java:149) at gltest.GameMain$1.componentResized(GameMain.java:59) (...) 

I am completely clueless. The boundaries returned from the size of the canvas seem to be allright, but once I use them on the viewport, they throw errors. The same happens when I instead make the viewport call like "glViewport(1, 1, 100, 100)". All these values are well within the boundaries of the window, yet still it throws the very same nullPointerExceptions when I resize the window.

I am out of ideas and energy to figure out why (I have been googling for 3 hours now, no result). What am I doing wrong?

import java.awt.Canvas; import java.awt.Dimension; import java.awt.GraphicsConfiguration; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent;  import javax.swing.JFrame;  import org.lwjgl.LWJGLException; import org.lwjgl.Sys; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode;  import static org.lwjgl.util.glu.GLU.*; import static org.lwjgl.opengl.GL11.*;  public class GameMain {     public JFrame frame;     public Canvas canvas;      public boolean initialize(int width, int height) {         try {             Canvas canvas = new Canvas();             JFrame frame = new JFrame("Open Rock Raiders - Delta");             this.canvas = canvas;             this.frame = frame;             ComponentAdapter adapter = new ComponentAdapter() {                 public void componentResized(ComponentEvent e) {                     resize();                 }             };              canvas.addComponentListener(adapter);             canvas.setIgnoreRepaint(true);             frame.setSize(640, 480);             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);             frame.getContentPane().add(canvas);             frame.setVisible(true);             Dimension dim = this.canvas.getSize();              Display.setLocation(100, 100);             Display.setTitle("GL Window");             Display.setDisplayMode(new DisplayMode(dim.width, dim.height));             Display.setParent(canvas);             Display.create();              //openGL setup             glViewport(0, 0, dim.width, dim.height);             glMatrixMode(GL_PROJECTION);             glLoadIdentity();             gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);             glMatrixMode(GL_MODELVIEW);             glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);             glClearDepth(1.0);             glShadeModel(GL_FLAT);             glEnable(GL_DEPTH_TEST);             glDepthFunc(GL_LEQUAL);             glEnable(GL11.GL_CULL_FACE);              glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);             glEnable(GL_BLEND);             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);         } catch (LWJGLException le) {             le.printStackTrace();         }         return false;     }      public void resize()     {         Dimension dim = this.canvas.getSize();         GL11.glViewport(0, 0, dim.width, dim.height);     } } 
</div
              

Список ответов

1
 
vote
vote
Лучший ответ
 

Вы должны выполнять все операции отображения из основного потока. Если вы посмотрите на пример, который вы разместили в своем другом вопросе, вы можете увидеть, что новый размер холста хранится, а затем обновляется главной нитью. Это сделано поточно-безопасно тоже. Вы должны сделать это, а затем иметь цикл после вашей графической инициализации что-то подобное:

 <код> while (!closeRequested) {     GL11.glViewport(0, 0, dim.width, dim.height);     Display.update(); }  //finished Display.destroy();   
 

You should do all of the display operations from the main thread. If you look at the example you posted in your other question, you can see the new canvas size is stored and then updated by the main thread. It's done thread-safely too. You need to do that and then have a loop after your graphics initialisation something like this:

while (!closeRequested) {     GL11.glViewport(0, 0, dim.width, dim.height);     Display.update(); }  //finished Display.destroy(); 
</div
 
 
0
 
vote

Скорее всего, вы получаете первый событие для размера в размерах до инициализации OpenGL. Переместить <код> canvas.addComponentListener(adapter); После настроек OpenGL настроек.

 

Most likely you're getting the first resize event before opengl gets initialized. Move canvas.addComponentListener(adapter); after the OpenGL setup stuff.

</div
 
 

Связанный проблема

-2  В классе F250.java есть две петли, которые не будут работать  ( There are two loops in the f250 java class that wont run ) 
Класс F250.java - это объект оружия, и есть два метода, которые привлекают и обновляют пули, выходящие из пистолета. Я сделал класс пули и сделал массив пули ...

49  Как извлечь строку между двумя разграничителями [дубликат]  ( How to extract a string between two delimiters ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Улучшение моего жадного алгоритма  ( Improving my greedy algorithm ) 
** Это мой код, который выглядит способ найти сумму в массиве ** <код> public class Piecedemonei { public static void recherche(int[] tab) { ...

1  Кварц Schdeuler для нескольких проектов в JBOSS 5  ( Quartz schdeuler for multiple projects in jboss 5 ) 
Я развернул два проекта (P1 & AMP; P2) в JBOSS 5. Оба проекта настроены с различными кварцевыми планировщиками. Но когда я заплатурую работу на P1, он доступа...

1  Как увеличить предел параллельного соединения OpenFire?  ( How to increase openfire concurrent connection limit ) 
Я пытаюсь проверить, сколько одновременных пользовательских подключений Openfire может обрабатывать. Я заметил предел при 4000 пользователями. Как я могу ...

1  Android ListView с некоторыми показанными элементами и показывать больше кнопки  ( Android listview with some items shown and show more button ) 
Я нахожу его трудно искать то, что я ищу, поэтому я думал, что постараюсь объяснить это здесь. В настоящее время у меня есть пользовательский список в ScrollV...

0  Общее утверждение для ошибки recuralandom return - Java  ( General statement for securerandom return error java ) 
Я искал на протяжении разных форумов, и теперь я наконец-то ставит свой вопрос, так как я не могу найти конкретный ответ. Я пишу протокол безопасности для д...

2  Javafx Treeview клеточная фабрика с гридпаном  ( Javafx treeview cell factory with gridpane ) 
У меня есть <код> TreeView<GridPane> и <код> GridPane содержит несколько узлов, таких как кнопки и метки. Количество узлов внутри <Код> GridPane варьируетс...

4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена?  ( How to fully qualify a class whose package name collides with a local member nam ) 
ОК, вот очень любопытная языковая головоломка Java 7 для специалистов JLS там. Следующий кусок кода не скомпилируется, ни с Javac, ни с Eclipse: <код> ...

1  Простое Javaee HTML Get / Post Application  ( Simple javaee html get post application ) 
Я просто начинаю с Javaee (я вполне свободно владею в Javase), и у меня возникли проблемы с обездованием моего мозга вокруг всех новых вещей, которые необходи...

56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium?  ( When to use explicit wait vs implicit wait in selenium webdriver ) 
Я использую: <код> driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS); Но он все еще непрерывно не работает для нижеизведанного элемента ...

1  Могу ли я нажать на свой собственный объект пользователя в Security SecurityContext?  ( Can i push my own user object into springs securitycontext ) 
Я новичок в весенней безопасности и последовал за некоторыми основными рецептами, чтобы получить весеннюю безопасность, работающую в моем заявлении, но теперь...

12  Способ вызова в EJB на jboss запустить [дубликат]  ( Call method in ejb on jboss startup ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Строка заменить приключение в Java  ( String replace adventure in java ) 
Я пытаюсь добиться этого - если строка содержит шаблон <код> %25 с последующим любое количество альфа-цифровых символов, то мне нужно заменить <код> %25 с <...

1  Обратитесь к веб-странице внутри файла JAR  ( Refer to a web page inside a jar file ) 
У меня есть рабочий проект. Он включает в себя другой проект, который имеет дело с отдыхом как REST-API.jar. Теперь я сделал одностраничное интернет-интерфе...

Связанный проблема

-2  В классе F250.java есть две петли, которые не будут работать 
49  Как извлечь строку между двумя разграничителями [дубликат] 
1  Улучшение моего жадного алгоритма 
1  Кварц Schdeuler для нескольких проектов в JBOSS 5 
1  Как увеличить предел параллельного соединения OpenFire? 
1  Android ListView с некоторыми показанными элементами и показывать больше кнопки 
0  Общее утверждение для ошибки recuralandom return - Java 
2  Javafx Treeview клеточная фабрика с гридпаном 
4  Как полностью квалифицировать класс, имя пакета которого сталкивается с местным именем члена? 
1  Простое Javaee HTML Get / Post Application 
56  Когда использовать явное ожидание против неявного ожидания в Webdriver Selenium? 
1  Могу ли я нажать на свой собственный объект пользователя в Security SecurityContext? 
12  Способ вызова в EJB на jboss запустить [дубликат] 
0  Строка заменить приключение в Java 
1  Обратитесь к веб-странице внутри файла JAR