java - 在使用 MVP 模型时更改 javaFX 中的场景
问题描述
因此,我将 javaFX 用于学校项目,并且尝试更改主窗口中的场景,但我必须使用 MVP 模型,因此我必须设置一个事件处理程序来更改演示者类中的场景。我尝试通过使用 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'”
Presenter 被打包在一个名为“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 是什么。通常这是缺少导入。所以你需要做的就是在你的 Presenter 的包名之后的开头添加一个导入语句。
package view.presenter;
import package.Main;
但是让您的 IDE 帮助您 - 所有主要的 IDE(Eclipse、Intellij、Netbeans ......)都会建议导入包(如果有)。
是的,为此你确实需要一个 Main 包。不管你怎么称呼它——你需要一个包。另请参阅:如何访问默认包中的 java 类?以及如何从默认包中导入类
因为它是 Main 并且我假设您必须将“view”与 Main 分开,所以我建议为您的 Presenter 创建一个“main”包(最好使用项目名称)和一个子包“main.view”。这样你最终会得到一个这样的目录结构:
main+
+- view +
| +- Presenter.java
|
+-Main.java
但是......如果类在不同的包中,您只需要导入。因此,如果您将两个类都放入“视图”中,则不需要导入。
FWIW:
如果您的文件命名不正确,您也可能会收到错误消息。它必须命名为 Main.java”。
如果 Main 中的其他错误无法编译,那也可能导致问题。
推荐阅读
- python - 使用 yaml 更漂亮的浮动
- excel - 在 Excel 中拆分行并移动到 csv 行
- azure - Azure Vnet 到站点您的 VPN 连接受到影响,因为 S2S VPN 隧道已断开连接
- r - R中的字符串连接
- powershell - Get-InTuneManagedDevice deviceEnrollmentType 筛选失败
- npm - 可以使用 pnpm 仅使用一个包版本吗?
- android - Dagger 2:DaggerBroadcastReceiver 重新创建子组件
- browser - 无法将代理设置更改为 localhost 和端口 8080
- sed - <"$fileVariableName"> 在 csh 中有什么作用?
- amazon-web-services - 如何停止批量执行 Lambda Step 函数(一次停止多个执行)