使用 MVP 模型时在 javaFX 中更改场景
Changing scene in javaFX while using MVP model
所以我在一个学校项目中使用 javaFX,我试图在我的主要 window 中更改场景,但我必须使用 MVP 模型,所以我必须设置一个事件处理程序来更改演示者内部的场景 class。我尝试通过使用 Main class 中的变量(我在其中初始化第一个场景)并从那里更改场景
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
代码还没有微调,所以不要判断。
按钮工作等,但给定的错误是在 Main.window... 在 Presenter "cannot resolve symbol 'Main'"
presenter 被打包在一个名为 'view' 的包中,而 Main class 根本没有打包,如果我将 Presenter 从包中取出,代码似乎可以正常工作,但它是根据 MVP 模型不正确。
对于你的错误:"cannot resolve symbol 'Main'"
这条错误消息是不言自明的。编译器无法弄清楚 "Main" 是什么。
你首先错的是:
public class Main extends Application {
public Stage window = new Stage();
如果您想通过 "Main.window" 访问 window 属性,您需要将其设为静态。
public class Main extends Application {
public static Stage window;
并且在开始时,您还需要将 "this.window" 更改(consequent/consistent) 为 "Main.window":
public void start(Stage primaryStage){
//this.window = primaryStage;
Main.window = primaryStage;
第二件事是编译器没有被告知 Main 是什么。通常这是一个丢失的导入。所以你需要做的是在你的 Presenter 包名后面的开头添加一个 import 语句。
package view.presenter;
import package.Main;
但是让您的 IDE 帮助您 - 所有主要 IDE 的(Eclipse、Intellij、Netbeans...)将建议导入包(如果可用)。
是的,为此您确实需要 Main 包。不管你怎么称呼它——你需要一个包裹。另见:How to access java-classes in the default-package? and How to import a class from default package
因为它是 Main,我假设你必须将 "view" 与 Main 分开,我建议创建一个 "main" 包(最好使用项目名称)和一个子包 "main.view" 为您的演示者。这样你最终会得到这样的目录结构:
main+
+- view +
| +- Presenter.java
|
+-Main.java
但是...如果 类 在不同的包中,您只需要导入。因此,如果您将 类 都放入 "view",则不需要导入。
FWIW:
如果您的文件命名不正确,您也可能会遇到此错误。它必须命名为 Main.java".
如果 Main 因其中的其他错误而无法编译,那也可能导致问题。
所以我在一个学校项目中使用 javaFX,我试图在我的主要 window 中更改场景,但我必须使用 MVP 模型,所以我必须设置一个事件处理程序来更改演示者内部的场景 class。我尝试通过使用 Main class 中的变量(我在其中初始化第一个场景)并从那里更改场景
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
代码还没有微调,所以不要判断。 按钮工作等,但给定的错误是在 Main.window... 在 Presenter "cannot resolve symbol 'Main'"
presenter 被打包在一个名为 'view' 的包中,而 Main class 根本没有打包,如果我将 Presenter 从包中取出,代码似乎可以正常工作,但它是根据 MVP 模型不正确。
对于你的错误:"cannot resolve symbol 'Main'"
这条错误消息是不言自明的。编译器无法弄清楚 "Main" 是什么。
你首先错的是:
public class Main extends Application {
public Stage window = new Stage();
如果您想通过 "Main.window" 访问 window 属性,您需要将其设为静态。
public class Main extends Application {
public static Stage window;
并且在开始时,您还需要将 "this.window" 更改(consequent/consistent) 为 "Main.window":
public void start(Stage primaryStage){
//this.window = primaryStage;
Main.window = primaryStage;
第二件事是编译器没有被告知 Main 是什么。通常这是一个丢失的导入。所以你需要做的是在你的 Presenter 包名后面的开头添加一个 import 语句。
package view.presenter;
import package.Main;
但是让您的 IDE 帮助您 - 所有主要 IDE 的(Eclipse、Intellij、Netbeans...)将建议导入包(如果可用)。
是的,为此您确实需要 Main 包。不管你怎么称呼它——你需要一个包裹。另见:How to access java-classes in the default-package? and How to import a class from default package
因为它是 Main,我假设你必须将 "view" 与 Main 分开,我建议创建一个 "main" 包(最好使用项目名称)和一个子包 "main.view" 为您的演示者。这样你最终会得到这样的目录结构:
main+
+- view +
| +- Presenter.java
|
+-Main.java
但是...如果 类 在不同的包中,您只需要导入。因此,如果您将 类 都放入 "view",则不需要导入。
FWIW:
如果您的文件命名不正确,您也可能会遇到此错误。它必须命名为 Main.java".
如果 Main 因其中的其他错误而无法编译,那也可能导致问题。