有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX如何从其他阶段控制器访问控制器?

我的应用程序有两个阶段。第一阶段是主阶段,应用程序启动时启动。我为本阶段FXML文件和控制器做了如下准备:

  1. 启动器的启动器控制器(父级)。fxml,其中我有一个带有一些选项卡的选项卡视图,并包含在fx:id fxml文件中,用于每个人选项卡和TopMenuButtons
  2. WaitingMode用于WaitingMode的控制器(子级)。fxml(包含在Launcher.fxml中)
  3. 用于NewConversation的NewConversationController(子级)。fxml(包含在Launcher.fxml中)
  4. TopMenuButtons用于TopMenuButtons的控制器(子级)。fxml(包含在Launcher.fxml中)

发射器控制器:

    public class LauncherController implements Initializable {

@FXML
private TabPane wholeTabPane;
@FXML
private Tab waitingModeTab;
@FXML
private Tab newConversationTab;

@FXML
private WaitingModeController waitingModeFXMLController;
@FXML
private NewConversationController newConversationFXMLController;

@Override
public void initialize(URL location, ResourceBundle resources) {
    TabPane tabPane = wholeTabPane;
}

public void openNewConverationTab(){
    wholeTabPane.getSelectionModel().select(newConversationTab);
}
}

我在TopMenuButtons中有一个按钮,其方法是openassistantstage(),可以打开新的小舞台:

public class TopMenuButtonsController {

public void openAssisstantStage(ActionEvent event) {
    Stage stage = (Stage)((Button)event.getSource()).getScene().getWindow();
    stage.setIconified(true);
    FXMLLoader loadAssisstant = new FXMLLoader(this.getClass().getResource(FXMLFilePaths.ASSISSTANT_FXML));
    Parent assisstant = null;

    try {
        javafx.geometry.Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
        assisstant = (Parent) loadAssisstant.load();
        Stage waitingStage = new Stage();
        waitingStage.setTitle("Asystent");
        waitingStage.setScene(new Scene(assisstant));
        waitingStage.setAlwaysOnTop(true);
        waitingStage.initStyle(StageStyle.UNDECORATED);
        waitingStage.setX(primaryScreenBounds.getMaxX() - 500);
        waitingStage.setY(primaryScreenBounds.getMinY());
        waitingStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

对于这个阶段,我还有FXML文件和控制器(assistantcontroller)。只有两个按钮——第一个按钮应该打开前一个阶段并关闭当前阶段,但第二个按钮也应该打开前一个阶段,关闭当前阶段,并在我的选项卡视图中打开一个特定的选项卡,并执行一些其他逻辑,例如获取实际的本地日期:

    public class AssisstantController {

@FXML
private Button maxWindowButton;
@FXML
private Button goToNewConversationButton;

@FXML
public void openMainWindow(ActionEvent actionEvent) {
    Stage stage = (Stage) ((Button) actionEvent.getSource()).getScene().getWindow();
    stage.close();
    Launcher.getMainStage().setIconified(false);
}

@FXML
public void goToNewConversation(ActionEvent actionEvent) {
    FXMLLoader loader = new FXMLLoader(getClass().getResource(FXMLFilePaths.LAUNCHER_FXML));
    LauncherController controller = (LauncherController)loader.getController();
    controller.openNewConverationTab();

    Stage stage = (Stage) ((Button) actionEvent.getSource()).getScene().getWindow();
    stage.close();
    Launcher.getMainStage().setIconified(false);

//do other logic...
}
}

我不能,因为助理不是launcher的孩子。出于同样的原因,我不能使用Mediator pattern

打开前一个阶段可以很好地工作,但当我试图从FXMLLoader访问LauncherController时,我有一个由

controller.openNewConverationTab();

在助理调度员。我不知道该怎么做。。。我想打开上一个阶段,并将特定选项卡设置为活动

我的带有main()和start()方法的启动器:

public class Launcher extends Application {

public static final String APP_NAME = "...";

public static Double AppVersion = 1.1;
private static Stage mainStage;

public static Stage getMainStage() {
    return mainStage;
}
public void openMainStage(Stage mainStage) {
    this.mainStage = mainStage;
}

@Override
public void start(Stage primaryStage) throws Exception {
    openMainStage(primaryStage);
    FXMLLoader loadMainScene = FXMLLoaderSingleton.getInstance().getLoader();
    loadMainScene.setLocation(this.getClass().getResource(FXMLFilePaths.LAUNCHER_FXML));
    Pane mainScenePane = loadMainScene.load();
    Scene mainScene = new Scene(mainScenePane);
    primaryStage.setScene(mainScene);
    primaryStage.setTitle(APP_NAME);
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}

}

共 (1) 个答案

  1. # 1 楼答案

    一种方法是 创建一个类,例如“StageConfig”

    public class StageConfig
    {
        private static TopMenuButtonsController tmbc = null;
        private static AssisstantController ac = null;
    
        public static void setTopMenuButtonsController(TopMenuButtonsController tmbc_val)
        {
            StageConfig.tmbc = tmbc_val;
        }
        public static TopMenuButtonsController getTopMenuButtonsController() 
        {
            return StageConfig.tmbc;
        }
    
        public static void setAssisstantController(AssisstantController ac_val)
        {
            StageConfig.ac = ac_val;
        }
        public static getAssisstantController getController() 
        {
            return StageConfig.ac;
        }
    
    }
    

    例如,现在初始化它

    public class TopMenuButtonsController implements Initializable
    {
    
       @Override
       public void initialize(URL location, ResourceBundle resources) 
       {
           StageConfig.setTopMenuButtonsController(this);
       }
    
    }
    

    现在你可以在任何你想使用的地方使用控制器

    StageConfig.getTopMenuButtonsController().SOMENODE.