ActionListener获取默认值

时间:2015-05-18 05:02:33

标签: java swing model-view-controller initialization

我正在用Java实现一个简单的应用程序。我正在为应用程序使用MVC模块。问题是当我的Controller创建ViewModel的对象时,在尝试使用简单的get方法时,我会得到默认值而不是新值,即插入UI。这是一个代码例子:

查看:

public class Client extends JFrame {
    private float ammount;
    private JButton calculateButton;
    ...
    public void startUI(ActionListener listener) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Client frame = new Client(listener);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    ...
    public Client(ActionListener listener) {
    ...
                        ammount = 10;
    ...
    calculateButton = new JButton("Calculate");
    calculateButton.addActionListener(listener);
        add(calculateButton);
    ...
    public float getAmmount() {
        return (float) this.ammount;
}

控制器:

public class Controller implements ActionListener {

    private float result;
    private Server server = new Server();
    private Client client = new Client(this);

    public Controller() {
        server.rateParser();
        client.startUI(this);
    }

    public void actionPerformed(ActionEvent e) {
        result = client.getAmmount();
    }
}

主:

public class Program {

    // Main function
    public static void main(String[] args) {
        Controller controller = new Controller();
    }

}

然而,到目前为止,当我点击按钮并触发动作事件时, getAmmount方法返回-1,这是默认值。同样适用于Client类中的所有getter。有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

您正在初始化2个客户。

第一次位于main

内的通话中
Controller controller = new Controller();

初始化类时,其所有成员也会被初始化。由于ClientController的成员:

public class Controller implements ActionListener {

    private Client client = new Client(this); // 1st initialization
}

通过new Controller()电话进行初始化。

第二次是构造函数中的调用

public Controller() {

    server.rateParser();
    client.startUI(this); // <---- here
}

离开startUI的模糊,它是:

public void startUI(ActionListener listener) {

    Client frame = new Client(listener); // 2nd initialization
    frame.setVisible(true);
}

由于actionPerformed位于Controller内,因此client中调用的是result = client.getAmmount();字段。那个程序在整个程序的生命周期内都保持不变,因此返回默认值(在初始化时创建)。但是,您显示的客户端是frame的第二个客户端,您可以为其调用frame.setVisible(true);。那个被修改,但它的值永远不会读。