2015-05-18 3 views
0

Я реализую простое приложение на Java. Я использую модуль MVC для приложения. Проблема в том, что когда мой Controller создает объекты View и Model при попытке использовать простой метод get, я получаю значения по умолчанию, а не новые, которые я вставлял в пользовательский интерфейс. Вот код exmaple:Значения по умолчанию для 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

Рассмотрите возможность использования [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+0

Вы создаете экземпляр клиента с помощью конструктора 'Client (CurrencyParser, ActionListener)', но ваш фрагмент кода показывает конструктор 'Client (ActionListener)'. Может ли это быть причиной? –

+0

Извините, забыли удалить этот фрагмент кода. Исправлено. – user3134453

ответ

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);. Этот изменен, но его значения никогда не читаются.

Смежные вопросы