Это очень, очень странная и специфическая ситуация.Я сделал минимальный проверяемый пример:
Файл: Main.groovy
public class Main extends Application {
public static void main(String[] args) {
launch(Main,args);
}
@Override
public void start(Stage primaryStage) {
Button destroy = new Button("Break the program")
Button openWindow= new Button("Open new Window")
destroy.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "[IP censored]");
InitialContext ic = new InitialContext(env);
}
});
openWindow.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getClassLoader().getResource("test.fxml"))
TestController testController =new TestController()
loader.setController(testController)
Parent testWindowRoot = loader.load();
Scene scene = new Scene(testWindowRoot);
Stage stage = new Stage()
stage.setTitle("Test");
stage.setScene(scene);
stage.show();
}
});
HBox hbox = new HBox(destroy,openWindow)
StackPane root = new StackPane();
root.setPadding(new Insets(5));
root.getChildren().add(hbox);
primaryStage.setTitle("JavaFX Test");
primaryStage.setScene(new Scene(root, 300, 150));
primaryStage.show();
}
}
Файл: TestController.groovy
class TestController implements Initializable {
@FXML AnchorPane mainAnchorPane
@FXML Label label
public void initialize(URL arg0, ResourceBundle arg1) {
label.setText("test 2") //this is line 20
}
}
Файл: test.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="mainAnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label fx:id="label" layoutX="240.0" layoutY="192.0" text="Test 1" />
</children>
</AnchorPane>
Итак, это очень простой пример для воспроизведения того, что происходит.Когда я нажимаю на кнопку «Открыть окно», я вижу новое окно с текстом Test 2, потому что в методе TestController initialize()
есть вызов setText("Test 2")
.Затем, когда я нажимаю «Разбить программу», он создает карту и заполняет ее информацией JMS (извините, я не могу дать вам IP-адрес для очереди JMS) и создаю экземпляр InitialContext.После этого любой щелчок по кнопке Open Window приводит к сбою программыНи одно другое окно не открывается никогда.Я вижу следующую трассировку стека:
java.lang.NullPointerException: Cannot invoke method setText() on null object
[...]
at TestController.initialize(TestController.groovy:20)
Что, конечно, не соответствует действительности, поскольку у него никогда не возникало проблем с открытием этого окна, пока я не попытался подключиться к WebLogic.
Примечание: это толькопроисходит, когда я запускаю JavaFX из Groovy, а не из Java, что работает для меня безупречно в течение нескольких месяцев.
Итак, в чем же дело?Какая связь между этими двумя вещами?Почему я не могу открыть окно FXML после создания экземпляра InitialContext?
Использование jdk1.8.0_181
edit: Я НАШЕЛ ВРЕМЕННОЕ РЕШЕНИЕ!Это только исправляет симптом, хотя.Проблема состояла в том, что объекты GUI были волшебным образом установлены в нуль после использования WL.Ну, я могу просто использовать метод lookup () , чтобы «обновить» ссылку на объект.Это не идеальное решение, очевидно, но мой код работает сейчас.Мне все еще крайне любопытно, как правильно ответить на этот вопрос.