使用MVP模型时在JavaFX中更改场景

时间:2019-03-02 18:49:11

标签: java mvp

所以我在学校项目中使用javaFX,并且尝试在主窗口中更改场景,但是我不得不使用MVP模型,因此我必须设置事件处理程序以更改presenter类内部的场景。 。我尝试通过使用Main类中的变量(在其中初始化第一个场景)并从那里更改场景来实现这一点

public class Main extends Application {
    public Stage window = new Stage();
    @Override
    public void start(Stage primaryStage){
        this.window = primaryStage;
        Model model = new Model();
        mainMenuView view = new mainMenuView();
        Presenter presenter = new Presenter(model, view);
        Scene mainMenu = new Scene(view);

        window.setScene(mainMenu);
        window.setTitle("Landen Quiz Main Menu");
        window.setWidth(250);
        window.setHeight(400);
        window.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}
//Main class used to make the main menu (first scene)

public class Presenter {
    private Model model;
    private view.mainMenuView mainMenuView;
    public Presenter(Model model, mainMenuView mainMenuView) {
        this.model = model;
        this.mainMenuView = mainMenuView;
        addEventHandlers();
        updateView();
    }

    private void addEventHandlers(){
        mainMenuView.getBtnHelp().setOnAction(e -> {
            helpView view = new helpView();
            Scene help = new Scene(view);
            Main.window.setScene(help);
            Main.window.setTitle("Help");
            Main.window.show();
        });

    }
    private void updateView(){
        //fill mainMenuView with data from model
    }
}
//Presenter class used to handel events in GUI

该代码尚未经过微调,因此请不要判断。 该按钮有效,但是给定的错误在Presenter的Main.window ...上“无法解析符号'Main'”

presenter打包在一个名为“ view”的包中,而Main类根本没有打包,如果我将Presenter从包中取出,代码似乎可以正常工作,但是根据MVP模型,这是不正确的。

1 个答案:

答案 0 :(得分:0)

对于您的错误:“无法解析符号'Main'”

此错误消息很不言自明。编译器无法弄清楚“ Main”是什么。

您犯的第一件事是:

public class Main extends Application {
    public static Stage window;

如果要通过“ Main.window”访问window属性,则需要将其设置为静态。

public void start(Stage primaryStage){
    //this.window = primaryStage;
    Main.window = primaryStage;

在开始时,您还需要(连续/一致)将“ this.window”更改为“ Main.window”:

package view.presenter;
import package.Main;

第二件事是没有告诉编译器Main是什么。通常这是缺少的导入。因此,您需要做的是在程序包名称之后的开头处将一个导入语句添加到Presenter中。

main+
    +- view + 
    |       +- Presenter.java
    |
    +-Main.java

但是,请让您的IDE帮您-所有主要的IDE(Eclipse,Intellij,Netbeans ...)都会建议导入该软件包(如果有)。

是的,为此,您确实需要Main的包装。怎么称呼都没关系-您需要一个包装。另请参见:How to access java-classes in the default-package?How to import a class from default package

由于它是Main,所以我假设您必须将“ view”与Main分开,因此我建议为Presenter创建一个“ main”包(最好使用项目名称)和一个子包“ main.view”。这样,您将得到一个像这样的目录结构:

{{1}}

但是...如果类位于不同的程序包中,则仅需要导入。因此,如果将两个类都放入“视图”中,则不需要导入。

FWIW:

如果文件命名不正确,也可能会出现错误。它必须命名为Main.java”。

如果Main因其他错误而无法编译,则也可能导致问题。