groovy-javafx-Can';在使用WebLogic InitialContext之后,请不要从FXML打开新窗口

groovy-javafx-Can';在使用WebLogic InitialContext之后,请不要从FXML打开新窗口,java,javafx,groovy,jms,weblogic,Java,Javafx,Groovy,Jms,Weblogic,这是一个非常非常奇怪和特殊的情况。我举了一个最小的可验证的例子: 文件: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 th

这是一个非常非常奇怪和特殊的情况。我举了一个最小的可验证的例子:

文件: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();
}
}
文件: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>
这当然不是真的,因为在我尝试连接到WebLogic之前,他打开那个窗口从来没有遇到过问题

注意:这只发生在我从Groovy执行JavaFX时,而不是从Java执行JavaFX时,Java已经完美地为我工作了几个月

那么,怎么回事?这两件事之间有什么联系?为什么在实例化InitialContext后不能打开FXML窗口

使用jdk1.8.0_181


编辑:我找到了一个解决办法!不过,它只是修复了症状。问题是GUI对象在使用WL后被神奇地设置为null。我可以用这个方法“刷新”对象引用。这显然不是一个完美的解决方案,但我的代码现在可以工作了。我仍然非常好奇这个问题的真实答案。

我认为这是因为您创建了这样的控制器

TestController TestController=newtestcontroller()

使用
加载程序

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


只是一个猜测:也许初始化WebLogic会搞乱类装入器。在使用之前,请尝试打印出
getClass().getClassLoader().getResource(“test.fxml”)
的值。

很抱歉,这没有抓住要点。在我使用WebLogic InitialContext之前,我打开其他阶段的方法工作得很好。如果我不必使用WL,一切都会很完美。这看起来更像是一个评论而不是一个答案。
 java.lang.NullPointerException: Cannot invoke method setText() on null object
 [...]
 at TestController.initialize(TestController.groovy:20)
 FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("test.fxml"));
 TestController testController = (TestController) loader.getController();
TestController testController =  loader.getController();