2015-05-18 32 views
0

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

查看:

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课程中的所有获得者都一样。有没有人知道为什么会发生这种情况?

+3

考虑提供一个[可运行示例](https://stackoverflow.com/help/mcve),它演示了您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将导致更少的混淆和更好的响应 – MadProgrammer

+0

您正在使用'Client(CurrencyParser,ActionListener)'构造函数实例化Client实例,但是您的代码片段显示了'Client(ActionListener)'构造函数。这可能是原因吗? –

+0

对不起,忘了删除那段代码。现在修复。 – user3134453

回答

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);。那个被修改,但它的值永远不会被读取。