Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将OpenGL上下文获取到我的当前线程中,未找到OpenGL上下文_Java_Opengl_Lwjgl_Event Listener - Fatal编程技术网

Java 如何将OpenGL上下文获取到我的当前线程中,未找到OpenGL上下文

Java 如何将OpenGL上下文获取到我的当前线程中,未找到OpenGL上下文,java,opengl,lwjgl,event-listener,Java,Opengl,Lwjgl,Event Listener,我正在使用Java和JLWGL开发一个有趣的世界编辑器。到目前为止一切正常。现在,我尝试创建一个窗口,可以在其中添加地形或新模型以供使用。问题是,当我尝试从主线程创建地形时,它被创建并显示,但当我尝试通过按钮eventlistener调用它时,我得到了错误:在当前线程中找不到OpenGL上下文。我基本上知道为什么会出现错误。我用来获取输入并单击按钮的框架没有opengl上下文 我现在的问题是:如何将opengl上下文添加到当前帧中? 欢迎任何帮助,如果您需要其他课程,请告诉我 这可能是因为如果我

我正在使用Java和JLWGL开发一个有趣的世界编辑器。到目前为止一切正常。现在,我尝试创建一个窗口,可以在其中添加地形或新模型以供使用。问题是,当我尝试从主线程创建地形时,它被创建并显示,但当我尝试通过按钮eventlistener调用它时,我得到了错误:在当前线程中找不到OpenGL上下文。我基本上知道为什么会出现错误。我用来获取输入并单击按钮的框架没有opengl上下文

我现在的问题是:如何将opengl上下文添加到当前帧中? 欢迎任何帮助,如果您需要其他课程,请告诉我

这可能是因为如果我运行GenerateTrain(args);从我的主要观点来看,它工作得非常好,只要我在eventlisteneraddTerrain.addActionListener中使用它,然后在那里使用GenerateTrain(1,terrains)

这是我的主要课程:

公共类MainGameLoop扩展了JFrame{
//创建加载程序
最终静态加载器=新加载器();
公共静态void main(字符串[]args){
//创建显示
createDisplay();
//创建摄影机
摄像机=新摄像机(15f、5f、40f);
//创建主渲染器
最终主渲染器=新主渲染器();
//列表
最终列表TextureModels=new ArrayList();
最终列表实体=新的ArrayList();
最终列表地形=新ArrayList();
//将模型加载到VAOs中
//1
loadTexturedModel(“失速”、“失速”、texturedModels);
//2
加载纹理模型(“龙”、“白”、纹理模型);
//3
//loadTexturedModel(“lowPolyTree”,“lowPolyTree”,texturedModels,loader);
//厄斯泰尔实体
//generateEntity(texturedModels.get(1-1)、15、0、15、0、180、0、1、entities);
//generateEntity(texturedModels.get(3-1)、5、0、5、0、0、1、entities);
//generateEntity(texturedModels.get(3-1)、23、0、8、0、90、0、0.7f、实体);
//测试反射率
/*
ModelTexture texture1=entities.get(0.getModel().getTexture();
纹理1.设置反射率(10f);
结构1.减振器(10);
*/
//创造光明
灯光=新灯光(新矢量3F(3000020002000)、新矢量3F(2.5f、2.5f、2.5f));
//创建地形
//GeneraterTrain(0,地形);
//发电机降雨(1,地形);
////////////////////////////////////////////////////////////////////
//世界编辑芬斯特
////////////////////////////////////////////////////////////////////
//埃斯泰尔·芬斯特
最终JFrame f=新JFrame(“地图编辑器”);
//男装
梅努巴;
//男装
JMenu fileMenu;//fileMenu
JMenu lightTerrainMenu;//LightTerrain菜单
JMenu modelMenu;//modelMenu
//门蓬特
JMenuItem createNewWorld;//新世界
JMenuItem saveWorld;//保存
JMenuItem loadWorld;//加载
JMenuItem addTree;//addTree
JMenuItem addModel;//添加模型
JMenuItem close;//退出
jmenu地形;
jmenuItemAddLight;
//创建菜单栏
menuBar=newjmenubar();
//创建菜单
fileMenu=newjmenu(“文件”);
lightTerrainMenu=新JMenu(“地形/灯光”);
modelMenu=新JMenu(“Model”);
//创建菜单项
createNewWorld=newjmenuItem(“新世界”);
saveWorld=新项目(“Save world”);
loadWorld=新JMenuItem(“加载世界”);
addTree=newjmenuItem(“添加树”);
addModel=新JMenuItem(“添加模型”);
关闭=新项目(“关闭”);
addTerrain=新项目(“添加地形”);
addLight=新的JMenuItem(“添加灯光”);
//添加菜单项
fileMenu.add(createNewWorld);
fileMenu.add(saveWorld);
fileMenu.add(loadWorld);
文件菜单。添加(关闭);
lightTerrainMenu.add(添加地形);
lightTerrainMenu.add(添加灯光);
modelMenu.add(addTree);
modelMenu.add(addModel);
//将菜单添加到菜单栏
菜单栏。添加(文件菜单);
菜单栏。添加(lightTerrainMenu);
菜单栏。添加(模型菜单);
//将菜单添加到框架
f、 添加(菜单栏,边界布局。北);
//创建窗口
f、 设置大小(400300);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
////////////////////////////////////////////////////////////////////////////////////////////////
//监听器
////////////////////////////////////////////////////////////////////////////////////////////////
//添加地形列表
addTerrain.addActionListener(新的java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent e){
最终JFrame f2=新JFrame(“添加地形”);
最终JLabel l1=新JLabel(“地形只能是:1x1、2x2、3x3…”);
最终JLabel l2=新JLabel(“例如,如果输入2,则将是2x2地形”);
按钮b1=新按钮(“创建地形”);
最终文本字段tfield=新文本字段(“,1);
l1.立根(50、10、250、30);
l2.立根(50,40,250,30);
特菲尔德退步(50,70,130,30);
b1.立根(50100120,30);
b1.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
字符串输入=tfield.getText();
发电机降雨(1,地形);
}  
});
f2.添加(b1);
f2.添加(l1);
f2。
public class MainGameLoop extends JFrame{
    //CREATING THE LOADER
    final static Loader loader = new Loader();

    public static void main(String[] args) {

        //CREATING THE DISPLAY
        DisplayManager.createDisplay();


        //CREATE CAMERA
        Camera camera = new Camera(15f, 5f, 40f);

        //CREATE MASTER RENDERER
        final MasterRenderer renderer = new MasterRenderer();

        //LISTS
        final List<TexturedModel> texturedModels=new ArrayList<TexturedModel>(); 
        final List<Entity> entities=new ArrayList<Entity>();
        final List<Terrain> terrains=new ArrayList<Terrain>(); 

        //Loading the models into the VAOs
        //1
        loadTexturedModel("stall", "stall", texturedModels);
        //2
        loadTexturedModel("dragon", "white", texturedModels);
        //3
        //loadTexturedModel("lowPolyTree", "lowPolyTree", texturedModels, loader);


        //ERSTELLE ENTITIES
        //generateEntity(texturedModels.get(1-1), 15, 0, 15, 0, 180, 0, 1, entities);
        //generateEntity(texturedModels.get(3-1), 5, 0, 5, 0, 0, 0, 1, entities);
        //generateEntity(texturedModels.get(3-1), 23, 0, 8, 0, 90, 0, 0.7f, entities);


        //TEST REFLECTIVITY
        /*
        ModelTexture texture1 = entities.get(0).getModel().getTexture();
        texture1.setReflectivity(10f);
        texture1.setShineDamper(10);
        */

        //CREATE LIGHT
        Light light = new Light(new Vector3f(3000,2000,2000), new Vector3f(2.5f,2.5f,2.5f));

        //CREATE TERRAIN
        //generateTerrain(0, terrains);
        //generateTerrain(1, terrains);

        ////////////////////////////////////////////////////////////////////
        //WORLD EDITOR FENSTER
        ////////////////////////////////////////////////////////////////////

        //ERSTELLE FENSTER
        final JFrame f=new JFrame("Map Editor"); 

        //MENÜLEISTE
        JMenuBar menuBar;

        //MENÜS 
        JMenu fileMenu;         //FileMenu
        JMenu lightTerrainMenu;     //LightTerrain Menu
        JMenu modelMenu;        //ModelMenu

        //MENÜPUNKTE
        JMenuItem createNewWorld;   //New World
        JMenuItem saveWorld;        //Save
        JMenuItem loadWorld;        //Load
        JMenuItem addTree;          //AddTree
        JMenuItem addModel;         //Add Model
        JMenuItem close;            //Quit

        JMenuItem addTerrain;
        JMenuItem addLight;


        //CREATE MENUBAR
        menuBar = new JMenuBar();

        //CREATE MENUS
        fileMenu = new JMenu("File");
        lightTerrainMenu = new JMenu("Terrain/Light");
        modelMenu = new JMenu("Model");

        //CREATE MENUITEMS
        createNewWorld = new JMenuItem("New world");
        saveWorld = new JMenuItem("Save world");
        loadWorld = new JMenuItem("Load world");
        addTree = new JMenuItem("Add tree");
        addModel = new JMenuItem("Add model");
        close = new JMenuItem("Close");

        addTerrain = new JMenuItem("Add terrain");
        addLight = new JMenuItem("Add light");

        //ADD MENU ITEMS
        fileMenu.add(createNewWorld);
        fileMenu.add(saveWorld);
        fileMenu.add(loadWorld);
        fileMenu.add(close);

        lightTerrainMenu.add(addTerrain);
        lightTerrainMenu.add(addLight);

        modelMenu.add(addTree);
        modelMenu.add(addModel);


        //ADD MENUS TO MENU BAR
        menuBar.add(fileMenu);
        menuBar.add(lightTerrainMenu);
        menuBar.add(modelMenu);


        //ADD MENU TO FRAME
        f.add(menuBar, BorderLayout.NORTH);

        //CREATE WINDOW
        f.setSize(400, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);  


        ////////////////////////////////////////////////////////////////////////////////////////////////
        //LISTENER LISTENER LISTENER LISTENER
        ////////////////////////////////////////////////////////////////////////////////////////////////


      //ADDTERRAIN LISTENR
        addTerrain.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {

                final JFrame f2=new JFrame("Add Terrain");
                final JLabel l1 = new JLabel("Terrain can only be: 1x1, 2x2, 3x3...");
                final JLabel l2 = new JLabel("e.g. if you enter 2 it will be a 2x2 terrain");
                Button b1=new Button("Create Terrain"); 
                final TextField tfield = new TextField("", 1);
                l1.setBounds(50, 10, 250, 30);
                l2.setBounds(50, 40, 250, 30);
                tfield.setBounds(50, 70, 130, 30);  
                b1.setBounds(50,100,120,30);  


                b1.addActionListener(new ActionListener(){  
                public void actionPerformed(ActionEvent e){  

                        String input= tfield.getText();
                        generateTerrain(1, terrains);

                }  
                });


                f2.add(b1);
                f2.add(l1);
                f2.add(l2);
                f2.add(tfield);

                f2.setSize(400,300);  
                f2.setLayout(null);

                f2.setVisible(true);

                }

        });

        //ADDMODEL LISTENER
        addModel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                final JFrame f1=new JFrame("Add Model");
                final JLabel l1 = new JLabel("NO MODEL");
                final JLabel l2 = new JLabel("NO TEXTURE");
                l1.setBounds(100, 30, 120, 30);
                l2.setBounds(250, 30, 120, 30);
                /////////////////////////
                //BUTTON ADD MODEL
                /////////////////////////
                Button b1=new Button("Choose model");  
                b1.setBounds(50,100,120,30);  

                b1.addActionListener(new ActionListener(){  
                public void actionPerformed(ActionEvent e){  
                    //CREATE FILE CHOOSER
                    JFileChooser fc = new JFileChooser();
                    FileNameExtensionFilter filter = new FileNameExtensionFilter("Object Dateien", "obj");
                    fc.setFileFilter(filter);
                    int returnVal = fc.showOpenDialog(null);
                    if(returnVal == JFileChooser.APPROVE_OPTION) {
                       System.out.println("You added the following model to your model library: " + fc.getSelectedFile().getName());
                       String currentLine = fc.getSelectedFile().getName();
                       System.out.println(currentLine);

                       String[] parts = currentLine.split("\\.");

                       String part1 = parts[0];
                       l1.setText(part1);
                    }  

                }  
                });

                /////////////////////////
                //BUTTON ADD TEXTURE
                /////////////////////////
                Button b2=new Button("Choose texture");  
                b2.setBounds(200,100,120,30);  

                b2.addActionListener(new ActionListener(){  
                    public void actionPerformed(ActionEvent e){  
                        //CREATE FILE CHOOSER
                        JFileChooser fc = new JFileChooser();
                        FileNameExtensionFilter filter = new FileNameExtensionFilter("Texture Dateien", "png");
                        fc.setFileFilter(filter);
                        int returnVal = fc.showOpenDialog(null);
                        if(returnVal == JFileChooser.APPROVE_OPTION) {
                            System.out.println("You added the following texture to your model: " + fc.getSelectedFile().getName());
                            String currentLine = fc.getSelectedFile().getName();
                            System.out.println(currentLine);

                            String[] parts = currentLine.split("\\.");

                            String part1 = parts[0];
                            l2.setText(part1);
                        }  

                    }  
                });
               Button b3=new Button("Add Model");  
                b3.setBounds(150,150,120,30);  

                b3.addActionListener(new ActionListener(){  
                    public void actionPerformed(ActionEvent e){  

                        l1.getText();
                        l2.getText();
                        //loadTexturedModel("lowPolyTree", "lowPolyTree", texturedModels, loader);
                        }  


                });


                f1.add(b1);
                f1.add(b2);
                f1.add(b3);
                f1.add(l1);
                f1.add(l2);
                f1.setSize(400,300);  
                f1.setLayout(null);

                f1.setVisible(true);

                }
        });
        //ADDTREE LISTENR
        addTree.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                //TREE

                generateEntity(texturedModels.get(3-1), 0, 0, 0, 0, 0, 0, 1, entities);
            }
        });

        //CLOSE LISTENER
        close.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                //Programm schließen

                int result = JOptionPane.showConfirmDialog((Component) null, "Unsaved changes will be lost!","Quit world editor?", JOptionPane.YES_NO_OPTION);
                if(result==0)
                System.exit(0);
            }
        });





        //////////////////////////////////////////////////////////////////////
        ////MAIN GAME LOOP
        /////////////////////////////////////////////////////////////////////
        while(!Display.isCloseRequested()){

            renderer.render(light, camera);
            DisplayManager.updateDisplay();

            camera.move();

            for(Terrain terr:terrains){
                renderer.processTerrain(terr);
            }

            for(Entity ent:entities){
                renderer.processEntity(ent);
            }


        }
        //////////////////////////////////////////////////////////////////////
        ////END MAIN GAME LOOP
        /////////////////////////////////////////////////////////////////////

        //CLEANUP
        renderer.cleanUp();
        loader.cleanUp();
        DisplayManager.closeDisplay();
    }


    public static void loadTexturedModel(String modelName, String textureName, List<TexturedModel> texturedModels){

        texturedModels.add( new TexturedModel(OBJLoader.loadObjModel(modelName,
                loader), new ModelTexture(loader.loadTexture(textureName))));
    }

    public static void generateEntity(TexturedModel model, int posX, int posY, int posZ,
            float rotX, float rotY, float rotZ, float scale, List<Entity> entities){

        entities.add(new Entity(model, new Vector3f(posX,posY,posZ), rotX, rotY, rotZ, scale));
    }
    public static void generateTerrain(int size, List<Terrain> terrains){
        terrains.add(new Terrain(size, 0, loader, new ModelTexture(loader.loadTexture("grass"))));
    }

    public static void genTexturedModel(String name1, String name2, List texturedModels){
        loadTexturedModel("lowPolyTree", "lowPolyTree", texturedModels);
    }



}