[英]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());
view
是GUI
類型, addSimpleHandler
是view
的成員 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 運行時按順序執行以下操作:
- 啟動 JavaFX 運行時(如果尚未啟動,請參閱
Platform.startup(Runnable)
了解更多信息)- 構造指定 Application class 的實例
- 調用
init()
方法- 調用
start(javafx.stage.Stage)
方法- 等待應用程序完成,當發生以下任一情況時會發生這種情況:
- 應用程序調用
Platform.exit()
- 最后一個 window 已關閉且
Platform
上的implicitExit
屬性為 true- 調用
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 。 無論您選擇哪個,請記下哪個線程調用每個方法,該方法與生命周期記錄在同一位置。 以下是要點:
init()
方法由JavaFX-Launcher線程調用。start(Stage)
和stop()
方法由JavaFX 應用程序線程調用。請記住,某些操作只能在JavaFX 應用程序線程上執行。
1. 如果需要,您仍然可以在 main 方法中調用Application#launch
之前執行代碼。 唯一的限制是代碼不應與 JavaFX 直接相關。
2. 你的構造函數當前是公開的並且有零參數——保持這種狀態。 JavaFX 要求應用程序 class 具有公共的、無參數的構造函數,以便通過反射構造實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.