【问题标题】:ActionListener get's default valuesActionListener 获取默认值
【发布时间】:2015-05-18 05:02:32
【问题描述】:

我正在用 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 类中的所有吸气剂也是如此。有谁知道为什么会这样?

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • 您正在使用 Client(CurrencyParser, ActionListener) 构造函数实例化客户端实例,但您的代码 sn-p 显示了 Client(ActionListener) 构造函数。这可能是原因吗?
  • 抱歉,忘记删除那段代码了。现已修复。
  • 更正标题。

标签: java swing model-view-controller initialization


【解决方案1】:

您正在初始化 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);
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2021-12-01
    • 2018-11-22
    • 2013-11-21
    • 1970-01-01
    • 2017-11-17
    • 2012-07-31
    相关资源
    最近更新 更多