gpt4 book ai didi

java - 使用 JavaFX 8 执行显示 FXML 的操作

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:33 34 4
gpt4 key购买 nike

我正在构建一个具有多个屏幕的 JavaFX 应用程序,因此需要多个 FXML 文件及其 Controller 。当应用程序启动所有 FXML 文件时, Controller 的初始化方法已经完成。

我有一个锁屏,用户需要输入密码才能进入下一个屏幕。当密码正确时,将检索员工的姓名并加载主菜单屏幕。

我想将用户名传递给主菜单屏幕中的标签,但我无法使用 Controller 的初始化方法,因为它已经被调用。

有没有办法在显示 FXML 屏幕时执行操作,以便我能够在 Controller 之间传递字符串?

非常感谢任何帮助!

ps。如果您想查看代码,请在下面评论。

编辑(为了更好地理解)

下面您可以找到代码:

Main.java

public class Main extends Application {

public static String screen1ID = "loginscherm";
public static String screen1File = "Lockscreen.fxml";
public static String screen2ID = "mainmenu";
public static String screen2File = "MainMenu.fxml";
//public static String screen3ID = "screen3";
//public static String screen3File = "Screen3.fxml";
public static Functions databaseConnection;

@Override
public void start(Stage stage) throws Exception {

databaseConnection = new Functions();
databaseConnection.DB_Connect();

octocash.GUI_Screens.ScreensController mainContainer = new octocash.GUI_Screens.ScreensController();
mainContainer.loadScreen(Main.screen1ID, Main.screen1File);
mainContainer.loadScreen(Main.screen2ID, Main.screen2File);

mainContainer.setScreen(Main.screen1ID);

Group root = new Group(); //als je meerdere vensters in moet laden
root.getChildren().addAll(mainContainer);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setFullScreen(true); //full screen without borders (no program menu bars)
stage.setFullScreenExitHint(""); //Don't show "Press ESC to exit full screen"
//stage.setFullScreenExitKeyCombination(KeyCombination.NO_MATCH); //NIET AANZETTEN VOOR JE IETS ANDERS GEMAAKT HEBT ZODAT JE ERUIT KUNT
stage.show();
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}

LockscreenController.java

public class LockscreenController implements Initializable, ControlledScreen {

ScreensController myController;

@FXML
private PasswordField passwordField;
public FlowPane mainContent;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

@Override
public void initialize(URL url, ResourceBundle rb) {
mainContent.setPrefSize(screenSize.getWidth(), screenSize.getHeight());
}

public void setScreenParent(ScreensController screenParent){
myController = screenParent;
}

@FXML
private void goToMainMenu(){
myController.setScreen(octocash.Main.screen2ID);
}

public static String employeeName;
public static String employeeIsAdmin;

@FXML
private void checkPassword(ActionEvent event){
String input = passwordField.getText();
String needsToBeChecked;
needsToBeChecked = (new octocash.Functions()).hashPassword(input);
String[][] employeeInfo = octocash.Main.databaseConnection.getData("some_query", Arrays.asList("naam","isAdmin"));

if(employeeInfo[0][0] != null) {
employeeName = employeeInfo[0][0];
employeeIsAdmin = employeeInfo[0][1];
goToMainMenu();
passwordField.setText("");
}
else{
passwordField.setText("");
}
}
}

MainMenuController.java

public class MainMenuController implements Initializable, ControlledScreen {

ScreensController myController;

public FlowPane mainContent;
public ToolBar toolBar;
public Region spacerToolbar;
public HBox buttonHolder;
public Button exitButton;
public Label currentlyLoggedIn;
public Button testButton;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

@Override
public void initialize(URL url, ResourceBundle rb) {
mainContent.setPrefSize(screenSize.getWidth(), screenSize.getHeight());
toolBar.setMinWidth(screenSize.getWidth());
buttonHolder.setHgrow(spacerToolbar, Priority.ALWAYS); //Align buttonHolder to the right
}

public void setScreenParent(ScreensController screenParent){
myController = screenParent;
}

@FXML
private void exitApplication(){
Stage stage = (Stage) exitButton.getScene().getWindow();
stage.close();
}
}

现在:我想从LockscreenController 获取employeeName 的值并将其发送到MainMenuController,而不使用初始化方法。

最佳答案

您必须找到一种方法来链接它们之间的 Controller ,或者只是必须有权访问其他 Controller 的 Controller ,并且您必须实现类似的方法

mainController.refreshMainMenuLabel(用户用户)

因此,当用户登录时,该 Controller 将调用主 Controller 的refreshMainMenuLabel

编辑

我会给你一个有 2 个 Controller 的例子

首先定义AppContext

 public static class AppContext{

//you can add the controllers by their variables
private Controller1 test1;
private Controller2 test2;

//or from a list which will require handling , but it will be more dynamic
private List<Controller> controllers;
private static AppContext context=null;
//You make the constructor private so its really a sigleton ,
//cause noone can access it from outer package
private AppContext()
{

}

public static AppContext getAppContext(){
if(context==null)
context=new AppContext();
return context;
}

public void setController1(Controller1 e)
{
test1=e;
}

public void setController2(Controller2 e)
{
test2=e;
}

public Controller1 getController1()
{
return test1;
}

public Controller2 getController2()
{
return test2;
}

}

因此可以从应用程序中的任何位置调用 AppContext.getAppContext().getController1() 等方法,因为 getAppcontext 是静态的,如果您有任何问题请告诉我

关于java - 使用 JavaFX 8 执行显示 FXML 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26057108/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com