Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 普通应用程序中的MVC设计问题_Java_Model View Controller_Javafx_Properties_Model Binding - Fatal编程技术网

Java 普通应用程序中的MVC设计问题

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(

我正在做一个股票模拟“游戏”,你可以买卖股票,也可以调用雅虎财经api,让股票信息显示在图表和一些标签上。我不想偏离MVC原则,我有一个我希望我的程序看起来如何的基本轮廓,但实际上它似乎有点复杂

我有4个包:fxml、model、view和controller

我使用FXML完成代码的GUI部分,并将FXML加载到视图包中的一个类中。视图类加载到fxml中,具有标签和onAction方法(用于按下按钮时)

这个设计好吗?我倾向于说不:

  • 我想尽可能地保持这种观点。此类的用途太多:
    • 读入FXML(理想情况下,这是我只希望这个类做的事情)
    • 将标签textproperties绑定到模型数据属性
    • 处理所有actionEvents(当按下Search按钮时,…)
  • 我的模型包似乎毫无用处。我可以直接设置标签的文本,而不是更改属性。这“似乎”适得其反
  • 目前我的控制器包中没有任何内容。理想情况下,我希望我的视图类只读取FXML,我的控制器包处理actionevents并更改模型中的数据

  • 我怎样才能重写它?

    你认为
    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
    }