Сцена JavaFX отказывается загружаться, хотя раньше она работала

Я создавал приложение JavaFX, когда что-то, что я пытался, зависло в программе, и мне пришлось закрыть ее вручную. Однако вместо того, чтобы закрыть программу в IntelliJ, я нажал X, чтобы закрыть ее. После этого окно отказывалось открываться, застревая на stage.setScene().

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

Вот мой код того, что у меня есть.

package gg.hipposgrumm.jsr_launcher;

import gg.hipposgrumm.jsr_launcher.scenes.*;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class JSRLauncherMain extends Application {
    public static Stage popup;

    @Override
    public void start(Stage stage) throws IOException {
        stage.setTitle("JSR Launcher");
        // Everything before this point executes.
        stage.setScene(new Scene(Home.create()));
        // Nothing after this point executes.
        stage.setMinWidth(240);
        stage.setMinHeight(120);
        stage.show();

        // More Code
    }

    public static void main(final String[] args) {
        launch();
    }
}
package gg.hipposgrumm.jsr_launcher.scenes;

import gg.hipposgrumm.jsr_launcher.JSRLauncherMain;
import gg.hipposgrumm.jsr_launcher.util.Game;
import gg.hipposgrumm.jsr_launcher.util.saving.ServerInfo;
import javafx.collections.FXCollections;
import javafx.geometry.Insets;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;

import java.io.IOException;

public class Home {
    public final BorderPane window;
    private final ComboBox<LoginInfo> accounts;
    private final ComboBox<ServerInfo> servers;

    private Home() {
        accounts = new ComboBox<>();
        accounts.setPromptText("Not Logged In");
        servers = new ComboBox<>();
        servers.setPromptText("No Server Selected");

        Button accountButton = new Button("Manage Accounts");
        accountButton.setOnAction((event) -> {
            try {
                JSRLauncherMain.popupLogin(false);
            } catch (IOException e) {
                throw new IllegalStateException("Failed to open the Login menu please report with the following stacktrace: ", e);
            }
        });
        Button serverButton = new Button("Manage Servers");
        serverButton.setOnAction((event) -> {
            try {
                // TODO: Make this open the server menu.
                JSRLauncherMain.popupLogin(false);
            } catch (IOException e) {
                throw new IllegalStateException("Failed to open the Server menu please report with the following stacktrace: ", e);
            }
        });
        BorderPane footer = new BorderPane(
                null,
                null,
                new HBox(servers, serverButton),
                null,
                new HBox(accounts,accountButton));
        footer.setPadding(new Insets(5));
        window = new BorderPane(new TabPane(
                // Tabs added here.
        ), null, null, footer, null);
        window.setMinSize(240, 120);
        window.setMaxSize(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
        window.setPrefSize(800, 400);

        window.setUserData(this);
    }


    public static Parent create() {
        Home home = new Home();
        home.update();
        return home.window;
    }

    public void update() {
        // This does a thing.
    }
}

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

Почему инициализация с двойной скобкой? (См. это.)

Basil Bourque 15.04.2024 04:45

Хорошо @BasilBourque, я удалил все двойные скобки в своем проекте. Хотя ничего не исправил.

Hipposgrumm 15.04.2024 05:11

В коде, который вы не предоставляете, есть неизвестная ошибка. В этом вам не помогут. Может помочь минимальный воспроизводимый пример.

jewelsea 15.04.2024 05:38

@jewelsea В настоящее время я не могу предоставить репозиторий. Я думаю, что отправил минимальный воспроизводимый пример, и на консоль не выводится никаких ошибок. Все, что я знаю, это то, что он застревает. Я думаю, что переход на Python может быть не такой уж плохой идеей.

Hipposgrumm 15.04.2024 05:40

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

Abra 15.04.2024 05:59

Вы можете попробовать удалить final из своего кода. Я не совсем уверен, что делает JFX в вашем случае. Но Абра прав: пожалуйста, приведите рабочий минимальный пример. И еще: переключение языка программирования из-за обнаружения ошибки — не лучшая идея. Это произойдет снова, только с другим языком. Вместо этого найдите и исправьте ошибку.

David Weber 15.04.2024 07:43

по крайней мере, вам следует опубликовать журнал стека ошибок во время выполнения для устранения неполадок.

Peng 15.04.2024 08:36

В какой операционной системе возникает эта проблема? Архитектура процессора? Версия JavaFX? Воспроизводит ли проблему точный код (т. е. его можно просто скопировать, вставить и выполнить как есть) в вашем вопросе?

Slaw 15.04.2024 09:02

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

Hipposgrumm 15.04.2024 15:41

Предоставленный код не компилируется и не может воспроизвести вашу проблему. По ссылке: «Минимальный: используйте как можно меньше кода, который по-прежнему создает ту же проблему. Полный: предоставьте все части, которые нужны кому-то другому для воспроизведения вашей проблемы в самом вопросе. Воспроизводимый: протестируйте код, который вы собираетесь предоставить, чтобы сделать уверен, что это воспроизводит проблему». Очевидно, что поскольку код не компилируется, он не делает ничего из этого.

jewelsea 15.04.2024 19:53

Я просто собираюсь спросить людей в Discord (так как туда и обратно гораздо проще). И как мне закрыть этот билет?

Hipposgrumm 15.04.2024 19:54

Вопрос уже закрыт. Если вы хотите удалить его, см. как удалить вопрос: «Непосредственно под публикацией, над любыми комментариями, есть серая ссылка на удаление». Поскольку вопрос уже закрыт, он, вероятно, будет удален автоматически, хотя, возможно, и без принятого ответа (я не знаю политики в этом отношении). Кроме того, я не знаю, сохранится ли для вас ссылка на удаление, если вопрос уже закрыт.

jewelsea 16.04.2024 20:59

«Вы не можете удалить этот вопрос, поскольку другие потратили время и усилия на его ответ».

Hipposgrumm 17.04.2024 02:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
13
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как уже говорилось, без минимально воспроизводимого примера невозможно дать точный ответ. Однако фраза «срабатывает один раз, а не потом» типична для приложения, использующего системный ресурс (файл, порт...) и не освобождающего его должным образом.

В JavaFX это обычно происходит потому, что кнопка с крестиком не отправляет сигнал прерывания и не останавливает JVM. Он просто закрывает основную сцену и останавливает платформу JavaFX. Если создается другой поток, то JVM поддерживается ими и ресурсы не освобождаются (процесс все равно должен быть открыт в фоновом режиме).

Определите, какие ресурсы могут быть заблокированы, и очистите их должным образом после использования или закрытия этапа, выполнив следующие действия:

public class JSRLauncherMain extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        stage.setTitle("JSR Launcher");
        
             
        // More Code
    }
    
    @Override
    public void stop() {
      // clear ressources
    }

Отредактируйте, чтобы использовать Applciation.stop() в качестве комментария.

Ресурсы при завершении работы приложения могут быть освобождены в реализации метода stop(): «Этот метод вызывается, когда приложение должно остановиться, и предоставляет удобное место для подготовки к выходу приложения и уничтожения ресурсов».

jewelsea 15.04.2024 09:09

Я попробую это сделать.

Hipposgrumm 15.04.2024 15:41

Мне это не помогает, и я не могу удалить вопрос, поэтому, пожалуй, просто отмечу его как правильный.

Hipposgrumm 15.04.2024 22:53

Другие вопросы по теме