Java 普通应用程序中的MVC设计问题
我正在做一个股票模拟“游戏”,你可以买卖股票,也可以调用雅虎财经api,让股票信息显示在图表和一些标签上。我不想偏离MVC原则,我有一个我希望我的程序看起来如何的基本轮廓,但实际上它似乎有点复杂 我有4个包:fxml、model、view和controller 我使用FXML完成代码的GUI部分,并将FXML加载到视图包中的一个类中。视图类加载到fxml中,具有标签和onAction方法(用于按下按钮时) 这个设计好吗?我倾向于说不:Java 普通应用程序中的MVC设计问题,java,model-view-controller,javafx,properties,model-binding,Java,Model View Controller,Javafx,Properties,Model Binding,我正在做一个股票模拟“游戏”,你可以买卖股票,也可以调用雅虎财经api,让股票信息显示在图表和一些标签上。我不想偏离MVC原则,我有一个我希望我的程序看起来如何的基本轮廓,但实际上它似乎有点复杂 我有4个包:fxml、model、view和controller 我使用FXML完成代码的GUI部分,并将FXML加载到视图包中的一个类中。视图类加载到fxml中,具有标签和onAction方法(用于按下按钮时) 这个设计好吗?我倾向于说不: 我想尽可能地保持这种观点。此类的用途太多: 读入FXML(
- 读入FXML(理想情况下,这是我只希望这个类做的事情)
- 将标签textproperties绑定到模型数据属性
- 处理所有actionEvents(当按下Search按钮时,…)
我怎样才能重写它?你认为
StockPanel
是你的观点吗?@Michael,我想这是一个值得讨论的问题,因为实际的gui是在fxml中制作的,StockPanel只是加载它。MVC有很多版本和变体,通常是一个非常松散的定义模式,特别是关于视图和控制器之间的关系。我可能会将您显示的StockPanel
类视为您的控制器(它更新模型…),将FXML文件本身视为视图(它定义布局等)。(可以说,这更像是MVP模式的“被动视图”变体。)所有这些变体的共同关键思想是将模型与视图和控制器分离-这使相同数据的所有视图彼此分离。@James_D你说得完全正确。StockPanel
类绝对是这里的控制器<代码>设置控制器(this)应该足以推断出这一点。FXML确实是视图。@Michael Well。。。当然,除了控制器熟悉视图中的组件,并通过绑定(而不是视图本身观察模型)更新这些组件之外。这就是为什么我说它可能更像是一个MVP演示者而不是MVC控制器,但这在某种程度上是令人毛骨悚然的。你认为StockPanel
是你的观点吗?@Michael,我想这是值得商榷的,因为实际的gui是在fxml中制作的,StockPanel只是加载它。MVC有很多版本和变体,它通常是一个定义非常松散的模式,特别是在视图和控制器之间的关系方面。我可能会将您显示的StockPanel
类视为您的控制器(它更新模型…),将FXML文件本身视为视图(它定义布局等)。(可以说,这更像是MVP模式的“被动视图”变体。)所有这些变体的共同关键思想是将模型与视图和控制器分离-这使相同数据的所有视图彼此分离。@James_D你说得完全正确。StockPanel
类绝对是这里的控制器<代码>设置控制器(this)应该足以推断出这一点。FXML确实是视图。@Michael Well。。。当然,除了控制器熟悉视图中的组件,并通过绑定(而不是视图本身观察模型)更新这些组件之外。这就是为什么我说它可能更像是一个MVP演示者而不是MVC控制器,但这在某种程度上是令人毛骨悚然的。
@FXML // 'view' label that gets changed when the model changes
private Label companyLabel;
public StockPanel(StockPanelModel model) {
this.model = model;
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/stocktab.fxml"));
loader.setRoot(this);
loader.setController(this);
try {
loader.load();
} catch (IOException ex) {
Logger.getLogger(StockPanel.class.getName()).log(Level.SEVERE, null, ex);
}
companyLabel.textProperty().bind(model.getCompanyName()); // bind the label to the model data
}
@FXML
void searchStock(ActionEvent event) throws IOException {
Stock stock = YahooFinance.get(searchField.getText());
model.setCompanyName(stock.getName()); // update model field
}