groovy - javafx - не могу открыть новое окно из FXML после использования WebLogic InitialContext - PullRequest
0 голосов
/ 28 ноября 2018

Это очень, очень странная и специфическая ситуация.Я сделал минимальный проверяемый пример:

Файл: 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 () , чтобы «обновить» ссылку на объект.Это не идеальное решение, очевидно, но мой код работает сейчас.Мне все еще крайне любопытно, как правильно ответить на этот вопрос.

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Просто дикая догадка: возможно, инициализация WebLogic испортила загрузчик классов.Попробуйте распечатать значение getClass().getClassLoader().getResource("test.fxml") перед его использованием.

0 голосов
/ 27 марта 2019

Я думаю, это потому, что вы создаете контроллер следующим образом

TestController testController =new TestController()

Используйте loader

 FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("test.fxml"));
 TestController testController = (TestController) loader.getController();

или

TestController testController =  loader.getController();
...