簡體   English   中英

groovy - javafx - 使用WebLogic InitialContext后無法從FXML打開新窗口

[英]groovy - javafx - Can't open new window from FXML after using WebLogic InitialContext

這是一個非常非常奇怪和具體的情況。 我做了一個最小的可驗證的例子:

文件: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>

所以這是重現所發生事情的一個非常基本的例子。 當我單擊Open Window按鈕時,我看到一個帶有文本Test 2的新窗口,因為在TestController的initialize()方法中有一個對setText("Test 2")的調用setText("Test 2") 然后當我點擊“Break the Program”時,它會創建一個地圖並用JMS信息填充它(抱歉我不能給你JMS隊列的IP)並實例化InitialContext。 之后,任何單擊“打開窗口”按鈕都會導致程序崩潰。 沒有其他窗口打開。 我看到以下堆棧跟蹤:

 java.lang.NullPointerException: Cannot invoke method setText() on null object
 [...]
 at TestController.initialize(TestController.groovy:20)

這當然不是真的,因為在我嘗試連接到WebLogic之前,他從未遇到過打開該窗口的問題。

注意:這只發生在我從Groovy執行JavaFX時,而不是從Java執行,這些內容已經為我完美地工作了好幾個月。

那么,這筆交易是什么? 這兩件事之間有什么聯系? 為什么我不能在實例化InitialContext后打開FXML窗口?

使用jdk1.8.0_181

編輯:我發現了一個變通方法! 它只能修復症狀。 問題是使用WL后GUI對象被神奇地設置為null。 好吧,我可以使用lookup()方法“刷新”對象引用。 這顯然不是完美的解決方案,但我的代碼現在可以正常工作。 我對這個問題的真正答案仍然非常好奇。

我想這是因為你創建了這樣的控制器

TestController testController =new TestController()

使用loader

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

要么

TestController testController =  loader.getController();

只是一個瘋狂的猜測:也許初始化WebLogic搞亂了類加載器。 嘗試在使用之前打印出getClass().getClassLoader().getResource("test.fxml")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM