Java Display.isCloseRequested() не будет показывать true

#java #lwjgl

#java #lwjgl

Вопрос:

Я только начал использовать LWJGL, и поэтому это невероятно простая проблема, с которой можно столкнуться, но я просмотрел Интернет и не могу придумать никакого решения. Также, вероятно, уместно: я на Mac.

Даже когда я нажимаю кнопку x, метод Display.isCloseRequested() отказывается возвращать true . Ниже приведен код для всего моего класса «window», который в основном является оболочкой для отображаемого объекта.

 import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;


public class Window {
    public static void createWindow(int width, int height, String title){
        Display.setTitle(title);
        try {
            Display.setDisplayMode(new DisplayMode(width,height));
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
        }   
    }
    public static void render(){
        Display.update();
    }
    public static boolean isCloseRequested(){
        System.out.println(Display.isCloseRequested());
        return Display.isCloseRequested();
    }
    public static int getWidth(){
        return Display.getDisplayMode().getWidth();
    }
    public static int getHeight(){
        return Display.getDisplayMode().getHeight();
    }
    public static String getTitle(){
        return Display.getTitle();
    }
}
 

На этот класс ссылается метод в основном классе, который выглядит следующим образом:

 private void run(){
        isRunning = true;
        while(isRunning){
            if (Window.isCloseRequested())
                stop();
            render();
        }
    }
 

Метод stop никогда не запускается, даже когда я нажимаю x-кнопку.

Комментарии:

1. System.out.println(Display.isCloseRequested()); — вы поставили это для устранения неполадок? Последующий вызов Display.isCloseRequested() будет (почти) всегда возвращать false .

Ответ №1:

Сделал несколько простых уроков, таких как http://ninjacave.com/lwjglbasics1 производить подобное ошибочное поведение?

Важно: я думаю, что существует также сброс события intern, которое id вызвало нажатием кнопки x, если вы дважды вызываете isCloseRequested.

Поэтому попробуйте сохранить событие и удалить системную строку

Ответ №2:

Ваша цель — просто остановить render() процесс, когда окно приложения закрыто?

Если это так, просто добавьте это в свое основное JFrame определение:

 //replace frame with your main JFrame containing the X close button
frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent we) {
        isRunning = false;
        frame.setVisible(false);
        frame.dispose();
    }
});
 

… и измените свой 2-й код на это:

 private void run(){
    isRunning = true;
    while(isRunning){
        render();
    }
}
 

Таким образом, когда вы закрываете главное окно своего приложения, значение переменной isRunning изменяется на false , и ваш while() цикл завершается завершением вашего render() .

На самом деле, сегодня я сам имел дело именно с этой проблемой. Я нажал на ваш пост до решения моей проблемы, но как только я ее решил, я возвращаюсь сюда, чтобы опубликовать свое решение (или, по крайней мере, то, как оно работало для меня).

Конечно, вы должны сделать одну и ту же isRunning переменную доступной для обоих.

На самом деле я тоже так и не узнал, почему это isCloseRequested() никогда не меняется false после того, как я закрыл свое приложение. Неважно, это мой рабочий файл — надеюсь, он сработает и для вас.