2013-05-18 45 views
1

我想用登錄屏幕做一個應用程序。我發現的所有例子都是關於如何製作屏幕本身,但並不是它如何適合更大的圖片(應用程序)。JavaFX登錄屏幕

所以我做了我的登錄屏幕,它在SQL數據庫中驗證用戶。登錄屏幕完美地工作,但從那裏我需要它啓動應用程序本身並跟蹤登錄的用戶,我認爲這應該很容易完成,因爲數據庫使用一個唯一的密鑰標識每個用戶。這裏的問題是,如何使用用戶Key作爲參數啓動我的應用程序,該參數將通過主應用程序可以打開的不同屏幕保持不變?

當前我正在啓動登錄屏幕,一旦用戶被驗證,將爲主應用程序創建一個新的舞臺。相關的代碼(一旦用戶驗證)是:

/* 
* login is correct 
*/         
Node source; 
source = (Node) t.getSource(); 
Stage thestage = (Stage) source.getScene().getWindow(); 
thestage.close(); 
Stage homestage = new Stage(); 
AnchorPane home = (AnchorPane) FXMLLoader.load(Punto_de_Venta.class.getResource("PuntoDeVenta.fxml")); 
Scene homescene = new Scene(home); 
homestage.setScene(homescene); 
homestage.setTitle("LanzDom Punto de Venta"); 
homestage.show(); 

我本來想過首先打開主應用程序,而不顯示階段,嵌套在登錄屏幕。我的想法是,我可以在主屏幕上設置一個變量,並在用戶密鑰的登錄屏幕中更新它,當用戶驗證後會返回該密鑰。然而,a)我不知道什麼是首選方法(或者是否有比我在這裏介紹的更好的方法)以及b)我做這件事的方式,如果用戶關閉登錄屏幕而不是點擊「ok」按鈕,即使用戶未被驗證,主應用程序階段也會出現。

任何和所有的幫助表示讚賞。

回答

0

我有一個名爲RootViewController的FXML放在舞臺上。在這裏,我把登錄FXML控制,然後用普通的應用程序窗口交換出來,雖然創建一個新的舞臺可能會更好。 login controller決定何時切換到應用程序。

數據的應用可以通過圍繞共享控制器之間的對象傳遞,可以自行實例化控制器:

MyController controller = new MyController(sharedObject); 
FXMLLoader loader = new FXMLLoader(); 
loader.setController(controller); 
loader.load(getClass().getResource("/control.fxml"); 

或者你可以使用依賴注入。查看https://bitbucket.org/atill/estimate的全部內容

+0

謝謝。這大部分工作。但是,當我使用單獨的.fxml將變量注入控制器時,如果我的變量在初始化之前很重要,出於某種原因它不起作用。作爲一種解決方法,在這種情況下,我會將我的控制器和GUI元素放到一個單獨的.java文件中,這使得我可以更好地控制每個元素。我假設必須有一種方法來在GUI初始化之前建立變量,以便我的變量可以用來激活/停用/隱藏不同的元素。任何人都可以幫忙嗎? – John

+0

在java中,構造函數總是在可​​以調用任何方法之前運行。只需在那裏設置你的變量,然後在調用#initialize時使用它們。 –