В текущем потоке не найден контекст OpenGL при использовании слушателя действия JFrame - PullRequest
0 голосов
/ 04 октября 2019

Я интегрировал 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();
        }
    }

}

...