当前位置: 首页 > 知识库问答 >
问题:

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

尹光辉
2023-03-14
    null
    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中有一个按钮,它具有openAssisstantStage()方法,打开新的小阶段:

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文件和控制器(AssisstantController)。只有2个按钮-第一个按钮应该打开前一个阶段和关闭电流,但第二个按钮也应该打开普雷沃阶段,关闭电流,也打开一个特定的标签在我的标签视图和做一些其他逻辑例如。获取实际localDate:

    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...
}
}

我无法在LauncherController中初始化我的AssisstantController,因为assisstant不是Launcher的子级。出于同样的原因,我不能使用Mediator模式。

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个答案

昝唯
2023-03-14

一种方法是创建一个类,例如“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.
 类似资料:
  • 我怎么绕过这个?我需要以某种方式再次实现那个方法,但突然间我不能通过作为一个论点的阶段。

  • 我需要通过单击从内部关闭。 我有一个主类,从中我创建了一个场景的主舞台。我使用FXML来实现这一点。 现在在出现的主窗口中,我有所有的控制项和菜单以及通过FXML和适当的控制类制作的东西。这就是我决定在帮助菜单中包含关于信息的部分。所以当菜单帮助-关于被激活时,我有一个事件正在发生,像这样: 正如所见,关于框窗口是通过带有控制器的FXML创建的。我想添加一个从控制器内关闭新阶段。 我发现自己能够做

  • 我有一个主要的场景,在那里我保留了所有的木鬼。它有一个菜单,打开新的场景,在那里我有一些设置: 这个eventLog文本区是我放置所有日志的地方,比如应用程序启动、设置更改、项目保存等。我正在用openProjectWindow void打开新场景,并且我正在将这些信息添加到我的日志记录程序中。我的新窗口是一个单独的类: 完成后,我需要访问StartController.EventLog,但我尝试

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。

  • 和访问字段,如: 因为我希望有更好的方法来做到这一点。