所以我正在使用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
代码没有经过微调,所以不要判断。按钮工作等但给定的错误是在Main.window ...在Presenter中“无法解析符号'Main'”
演示者打包在一个名为'view'的包中,并且Main类根本没有打包,如果我将Presenter从包中取出但是根据MVP模型它不正确,代码似乎工作正常。
对于您的错误:“无法解析符号'Main'”
这个错误消息是不言自明的。编译器无法弄清楚“Main”是什么。
你错的第一件事是:
public class Main extends Application {
public Stage window = new Stage();
如果要通过“Main.window”访问窗口属性,则需要将其设置为静态。
public class Main extends Application {
public static Stage window;
在你的开始你还需要将“this.window”改为(结果/一致)为“Main.window”:
public void start(Stage primaryStage){
//this.window = primaryStage;
Main.window = primaryStage;
第二件事是编译器没有被告知Main是什么。通常这是一个缺少导入。因此,您需要做的是在包名称后面的开头添加一个import语句到您的Presenter。
package view.presenter;
import package.Main;
但是让你的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”。有了这个,你最终会得到一个像这样的目录结构:
main+
+- view +
| +- Presenter.java
|
+-Main.java
但是......如果类在不同的包中,您只需要导入。因此,如果将两个类都放入“视图”中,则不需要导入。
FWIW:
如果您的文件未正确命名,也可能会收到错误。它必须命名为Main.java“。
如果Main无法编译其中的其他错误,那么也可能导致问题。