我正在用Java实现一个简单的应用程序。我正在为应用程序使用MVC模块。问题是当我的Controller
创建View
和Model
的对象时,在尝试使用简单的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。有人知道为什么会这样吗?
答案 0 :(得分:0)
您正在初始化2个客户。
第一次位于main
Controller controller = new Controller();
初始化类时,其所有成员也会被初始化。由于Client
是Controller
的成员:
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);
。那个被修改,但它的值永远不会读。