2015-05-18 60 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);。那個被修改,但它的值永遠不會被讀取。