【问题标题】:MVC problems. Getting values in Controller from ViewMVC 问题。从视图中获取控制器中的值
【发布时间】:2014-02-07 14:18:45
【问题描述】:

我正在开发 MVC 应用程序,但不知道当用户按下按钮时如何将视图中的文本字段值传递给控制器​​。这个按钮的ActionListener放在Controller中:

private class NewTaskListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        /* here I need to get values of textfields in View
           and pass them to AddNewTaskForUser
        */
        model.AddNewTaskForUser(userName, newTask);
    }
}

监听器以这种方式添加到按钮:

控制器:

this.view.AddNewTaskListanaer(new NewTaskListener());

查看:

public void AddNewTaskListanaer(ActionListener actionListener)
{
    btnSetupTask.addActionListener(actionListener);
}

谢谢!

【问题讨论】:

  • AddNewTaskListanaer 你打错字了
  • 谢谢!我已经改正了
  • 无关:请学习java命名约定并遵守它们。
  • 好的,感谢有用的建议!

标签: java swing model-view-controller


【解决方案1】:

你的视图应该有公共方法:

public String getTaskName() {
    return taskName.getText();
}

public String getDescription() {
    return description.getText();
}

// And so on and so on...

现在在您的控制器中,您可以从视图中获取所需的文本字段数据。所以现在在你的动作监听器中你可以这样做:

private class NewTaskListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

        String userName = view.getUsername();
        String newTask = view.getTaskName();

        model.AddNewTaskForUser(userName, newTask);
    }

}

这是假设动作侦听器类在控制器中声明,因此它可以访问控制器属性。

此外,方法不应以大写字母开头。它们的格式应为lowerCamelCase

例子:

addActionListeneractionPerformed

【讨论】:

    【解决方案2】:

    您需要将文本字段的实例传递给您的侦听器。

    private class NewTaskListener implements ActionListener {
    
        private JTextField textField;
    
        public NewTaskListener(JTextField textField) {
             this.textField = textField;
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            //.. do stuff
            model.AddNewTaskForUser(userName, newTask);
        }
    }
    

    并像这样创建它:

    this.view.AddNewTaskListanaer(new NewTaskListener(textField));
    

    【讨论】:

    • 但我做不到“this.view.AddNewTaskListanaer(new NewTaskListener(textField));”因为这段代码在Controller中,它对View中的textField一无所知
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2012-04-09
    • 2018-07-12
    • 2015-10-14
    相关资源
    最近更新 更多