簡體   English   中英

JavaFX 來自不同 class 的事件處理

[英]JavaFX Event handling from a different class

我查看了似乎與我的問題相似的 stackoverflow 問題,但沒有任何幫助。

這是我的問題:

對於一個項目,我正在制作一個 JavaFX 應用程序,該應用程序在沒有 FXML 的純 Java 中。 我有兩個類,一個 controller Controller class 和一個包含GUI內容的 ZA2F2ED4F8EBC2CBB4C21A29DC40AB6D

Controller有一個GUI類型的成員變量,我正在嘗試將事件處理程序分配給GUI中的一個按鈕,但它似乎不起作用。 它僅在我嘗試在GUI class 中實現處理程序時才有效,但我需要它在Comtroller中工作。

Controller的構造函數中如下:

        this.view = view;

        view.addSimpleHandler(new SimpleHandler());

viewGUI類型, addSimpleHandlerview的成員 function

SimpleHandler是 Controller 的內部Controller實現 EventHandler 並覆蓋handle() function

public void addSimpleHandler(EventHandler<ActionEvent> e) {
        simpleButton.setOnAction(e);
}

這是我的主要方法和GUI的 class 簽名

public class GUI extends Application {
//member variables for the GUI design including simpleButton
    private Button simpleButton;
    public static void main(String[] args) {
        GUI view = new GUI();
        Controller controller = new Controller(view);

        Application.launch(view.getClass(), args);

    }

    public GUI() {
       simpleButton = new Button("Simple button");

       //rest of code is setting up GUI into my panes
    }


    public void start(Stage primaryStage) throws Exception {
        Scene scene = new Scene(mainPane, sceneWidth, sceneHeight);
        //mainPane is a pane that contains simpleButton with a screenwidth and screenHeight
        primaryStage.setTitle("Simple");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

不要手動實例化您的應用程序 class。 要了解原因,請參閱有關 JavaFX 生命周期的文檔重點是我的):

JavaFX 應用程序的入口點是應用程序 class。 每當啟動應用程序時,JavaFX 運行時按順序執行以下操作:

  1. 啟動 JavaFX 運行時(如果尚未啟動,請參閱Platform.startup(Runnable)了解更多信息)
  2. 構造指定 Application class 的實例
  3. 調用init()方法
  4. 調用start(javafx.stage.Stage)方法
  5. 等待應用程序完成,當發生以下任一情況時會發生這種情況:
    • 應用程序調用Platform.exit()
    • 最后一個 window 已關閉且Platform上的implicitExit屬性為 true
  6. 調用stop()方法

如您所見,JavaFX 本身將實例化應用程序 class 並且它調用其生命周期方法的實例——這些方法是init()start(Stage)stop() 但是,在您的代碼中,您具有以下內容:

public static void main(String[] args) {
    GUI view = new GUI(); // created your own instance
    Controller controller = new Controller(view); // gave controller that instance

    // Launches JavaFX which starts the life-cycle documented above
    Application.launch(view.getClass(), args);
}

您創建自己的GUI實例。 此實例不受 JavaFX 管理,這意味着它的start(Stage)方法永遠不會被調用。 當您創建Controller實例並將其傳遞給您的GUI實例時,您將EventHandler添加到一個從不顯示的節點。 您看到的 window 來自作為對Application#launch調用的一部分創建的GUI實例,並且該GUI實例從未與Controller關聯。

對於 JavaFX 應用程序,您應該考慮將init()start(Stage)方法作為入口點1 換句話說,在上述生命周期方法之一中創建Controller 雖然我想你可以在構造函數中做同樣的事情,而不是2 無論您選擇哪個,請記下哪個線程調用每個方法,該方法與生命周期記錄在同一位置 以下是要點:

  • 應用程序 class 在JavaFX 應用程序線程上加載、初始化和構建。
  • init()方法由JavaFX-Launcher線程調用。
  • start(Stage)stop()方法由JavaFX 應用程序線程調用。

請記住,某些操作只能在JavaFX 應用程序線程上執行。


1. 如果需要,您仍然可以在 main 方法中調用Application#launch之前執行代碼。 唯一的限制是代碼不應與 JavaFX 直接相關。

2. 你的構造函數當前是公開的並且有零參數——保持這種狀態。 JavaFX 要求應用程序 class 具有公共的、無參數的構造函數,以便通過反射構造實例。

暫無
暫無

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

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