Я создавал приложение 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.
}
}
Я бы хотел включить репозиторий, но в настоящее время я хочу сохранить проект в тайне до его выпуска.
Хорошо @BasilBourque, я удалил все двойные скобки в своем проекте. Хотя ничего не исправил.
В коде, который вы не предоставляете, есть неизвестная ошибка. В этом вам не помогут. Может помочь минимальный воспроизводимый пример.
@jewelsea В настоящее время я не могу предоставить репозиторий. Я думаю, что отправил минимальный воспроизводимый пример, и на консоль не выводится никаких ошибок. Все, что я знаю, это то, что он застревает. Я думаю, что переход на Python может быть не такой уж плохой идеей.
Если вы ожидаете, что кто-то посмотрит на опубликованный вами код и расскажет, в чем проблема и как ее исправить, то я очень сомневаюсь, что это произойдет. По сути, вы просите помощи в отладке вашего кода. Простите, но из вашего вопроса неясно, пробовали ли вы уже отлаживать свой код. Насколько мне известно, очистка кешей сборки и перезагрузка компьютера не являются отладкой вашего кода. Чтобы помочь вам отладить ваш код, мне сначала нужно воспроизвести вашу проблему. Я считаю, что большинству других людей также придется сделать то же самое, чтобы помочь вам.
Вы можете попробовать удалить final
из своего кода. Я не совсем уверен, что делает JFX в вашем случае. Но Абра прав: пожалуйста, приведите рабочий минимальный пример. И еще: переключение языка программирования из-за обнаружения ошибки — не лучшая идея. Это произойдет снова, только с другим языком. Вместо этого найдите и исправьте ошибку.
по крайней мере, вам следует опубликовать журнал стека ошибок во время выполнения для устранения неполадок.
В какой операционной системе возникает эта проблема? Архитектура процессора? Версия JavaFX? Воспроизводит ли проблему точный код (т. е. его можно просто скопировать, вставить и выполнить как есть) в вашем вопросе?
Я не уверен, каким будет «минимально воспроизводимый пример». Я практически удалил все, что могло бы показаться неуместным, и ограничил это двумя классами (а не 20, которые у меня есть, многие из которых не имеют никакого отношения к проблеме).
Предоставленный код не компилируется и не может воспроизвести вашу проблему. По ссылке: «Минимальный: используйте как можно меньше кода, который по-прежнему создает ту же проблему. Полный: предоставьте все части, которые нужны кому-то другому для воспроизведения вашей проблемы в самом вопросе. Воспроизводимый: протестируйте код, который вы собираетесь предоставить, чтобы сделать уверен, что это воспроизводит проблему». Очевидно, что поскольку код не компилируется, он не делает ничего из этого.
Я просто собираюсь спросить людей в Discord (так как туда и обратно гораздо проще). И как мне закрыть этот билет?
Вопрос уже закрыт. Если вы хотите удалить его, см. как удалить вопрос: «Непосредственно под публикацией, над любыми комментариями, есть серая ссылка на удаление». Поскольку вопрос уже закрыт, он, вероятно, будет удален автоматически, хотя, возможно, и без принятого ответа (я не знаю политики в этом отношении). Кроме того, я не знаю, сохранится ли для вас ссылка на удаление, если вопрос уже закрыт.
«Вы не можете удалить этот вопрос, поскольку другие потратили время и усилия на его ответ».
Как уже говорилось, без минимально воспроизводимого примера невозможно дать точный ответ. Однако фраза «срабатывает один раз, а не потом» типична для приложения, использующего системный ресурс (файл, порт...) и не освобождающего его должным образом.
В 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(): «Этот метод вызывается, когда приложение должно остановиться, и предоставляет удобное место для подготовки к выходу приложения и уничтожения ресурсов».
Я попробую это сделать.
Мне это не помогает, и я не могу удалить вопрос, поэтому, пожалуй, просто отмечу его как правильный.
Почему инициализация с двойной скобкой? (См. это.)