Я интегрировал Display в JFrame, используя метод Canvas и Display.setParent (canvas). Теперь я хотел бы обновить загрузчик (данные) на боковом дисплее с помощью прослушивателя JButton Aciton. При этом я столкнулся со следующей ошибкой
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: No OpenGL context found in the current thread.
at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)
at org.lwjgl.opengl.GL30.glDeleteVertexArrays(GL30.java:1530)
at renderEngine.Loader.cleanUp(Loader.java:38)
at engineTester.MainGameLoop$2.actionPerformed(MainGameLoop.java:79)
Я нашел полезный ресурс, который прямо сейчас находится здесь Какчтобы получить контекст OpenGL в мой текущий поток, контекст opengl не найден Я знаю, что должен использовать Queue и Runnables, но я никогда не использовал их и не знаю, с чего начать. Может ли кто-нибудь помочь мне с кодом или шагами? или ресурс, где я могу начать и заставить его работать. Это важно для меня. Спасибо
Редактировать 1: добавление программы (Ошибка, брошенная там, где я прокомментировал строку внутри кнопки ActionListener)
package com.java8;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class LWJGLTester {
private volatile boolean isRunning = false;
private int frameWidth = 800;
private int frameHeight = 600;
private int displayWidth = 720;
private int displayHeight = 450;
private Thread glThread;
public static void main(String[] args) {
new LWJGLTester().runTester();
}
private void runTester() {
final JFrame frame = new JFrame("LWJGL in Swing");
frame.setSize(frameWidth, frameHeight);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
frame.setVisible(false);
frame.dispose(); //canvas's removeNotify() will be called
}
});
JPanel mainPanel = new JPanel(new BorderLayout());
JButton button = new JButton("BUTTON");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("From button");
loader.cleanUp(); // am trying to change the model data here which gives me the error
}
});
JPanel buttonPanel = new JPanel();
buttonPanel.add(button);
mainPanel.add(buttonPanel, BorderLayout.NORTH);
Canvas canvas = new Canvas() {
@Override
public void addNotify() {
super.addNotify();
startGL();
}
@Override
public void removeNotify() {
stopGL();
super.removeNotify();
}
};
canvas.setPreferredSize(new Dimension(displayWidth, displayHeight));
canvas.setIgnoreRepaint(true);
try {
Display.setParent(canvas);
Display.setVSyncEnabled(true);
} catch (LWJGLException e) {
//handle exception
e.printStackTrace();
}
JPanel canvasPanel = new JPanel();
canvasPanel.add(canvas);
mainPanel.add(canvasPanel, BorderLayout.SOUTH);
frame.getContentPane().add(mainPanel);
//frame.pack();
frame.setVisible(true);
}
private void startGL() {
glThread = new Thread(new Runnable() {
@Override
public void run() {
isRunning = true;
try {
Display.setDisplayMode(new DisplayMode(displayWidth, displayHeight));
Display.create();
} catch (LWJGLException e) {
//handle exception
e.printStackTrace();
}
// init OpenGL here
while(isRunning) {
Display.sync(60);
Display.update();
}
Display.destroy();
}
}, "LWJGL Thread");
glThread.start();
}
private void stopGL() {
isRunning = false;
try {
glThread.join();
} catch (InterruptedException e) {
//handle exception
e.printStackTrace();
}
}
}