基本的MVC构造,ActionListner不起作用

时间:2017-05-01 10:12:22

标签: java swing model-view-controller

我想做一个非常简单的MVC项目,当我点击按钮时,我想在我的控制台上看到“napis”,但是ActionListener无法正常工作。有什么想法吗 ? (如果我在帖子上做错了,请在这里理解我的第一篇文章:))

public class Model {

public String napis (){
    return "napis";
}

}

public class View {
private JFrame frame;
private JLabel label;
private JButton button;

public View (){
    frame = new JFrame();
    label = new JLabel("Napis");
    button = new JButton("click");

    frame.add(label);
    frame.add(button);
    frame.setSize(500,500);
    button.setSize(30,30);
    frame.setVisible(true);
}

public void addActionListener(ActionListener click){
    button.addActionListener(click);
}

}

public class Controller {
    private Model model;
    private View view = new View();

    public Controller (final Model model, View view) {
    view.addActionListener(
      new ActionListener(){


        @Override
        public void actionPerformed(ActionEvent e) {
            model.napis();
        }
      }      
    );{

    }

    }
}

ofc所有导入都是固定的。

3 个答案:

答案 0 :(得分:1)

model.napis();在控制台中没有写任何内容:

public String napis (){
    return "napis";
}

只返回String

这应该这样做:

@Override
public void actionPerformed(ActionEvent e) {
    System.out.println(model.napis());
}

答案 1 :(得分:0)

在您的控制器类中,更改

model.napis();

System.out.println(model.napis());

你的问题是动作监听器接受String但对它没有任何作用。你要做的是打印返回的字符串。

答案 2 :(得分:0)

好的,所以你的代码有点令人困惑。您的Controller正在创建View的实例,但也传递了View的实例。

它创建的实例没有附加ActionListener,但是你传入的实例没有。{/ p>

两个View都是创建并显示JFrame

Due frames

由于首先会创建您传递的View实例,但它首先显示,但View创建的Controller实例会创建第二个,它会显示在顶部 - 但它没有附加ActionListener ......

所以,你应该做的第一件事就是摆脱View正在创建的Controller的实例

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        Controller controller = new Controller(new Model(), new View());
    }

    public class Model {

        public String napis() {
            return "napis";
        }
    }

    public class View {

        private JFrame frame;
        private JLabel label;
        private JButton button;

        public View() {
            frame = new JFrame();
            label = new JLabel("Napis");
            button = new JButton("click");

            frame.add(label);
            frame.add(button);
            frame.setSize(500, 500);
            button.setSize(30, 30);
            frame.setVisible(true);
        }

        public void addActionListener(ActionListener click) {
            button.addActionListener(click);
        }
    }

    public class Controller {

        private Model model;
        private View view;

        public Controller(final Model model, View view) {
            this.view = view;
            this.model = model;
            view.addActionListener(
                new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Clicked");
                    this.model.napis();
                }
            });
        }
    }
}

您还应该关注View构造函数创建的副作用,创建和显示框架可能不是正确的选择

我还鼓励你研究“代码与接口不实现”的概念,因为它是MVC的关键方面之一