2015-09-13 2 views
0

У меня возникла небольшая проблема с JComboBox и MCV Pattern.Проблема с комбинацией и шаблоном MVC

В моем пакете «Вид» у меня есть класс gui. Это содержит выпадающий список.

package view; 
    public class Gui { 
    ......... 
    public JComboBox<OceanObject> oceanBoxDelete = new ComboBox<OceanObject> 
    (); 
    this.down.add(this.oceanBoxDelete); 

    this.oceanBoxDelete.setSize(40, 1); 
    ....... 

Это также содержит кнопку. Если кнопка попадает в нее, она запускает свист через прослушиватель кнопок/прослушиватель действий. Этот переключатель должен запускать процедуру с удалением объекта из списка. Если я помещаю прослушиватель действий в один и тот же файл java, он работает, но мне не разрешено это делать. Если я помещаю его в файл прослушивателя кнопок, я получаю исключение нулевого указателя при входе в combobox с неизвестным источником комментария и.

Моя кнопка слушатель выглядит следующим образом:

package control; 
    import view.Gui; 

    public class ButtonListener implements ActionListener{ 

    private Gui gui; 

    public ButtonListener() { 
    this.ocean = ocean; 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

    switch (ae.getActionCommand()) { 
    .... 
    case "Delete": 
     System.out.println("deleteButton wurde gedrueckt."); 

     OceanObject oObject = (OceanObject) 
     gui.oceanBoxDelete.getSelectedItem()); 
     go.removeOceanOjectFromOcean(oObject); 
    ....... 

Я могу видеть, что правый переключатель срабатывает, поскольку Println отображается прямо в консоли.

Так что я думаю, проблема в том, что проблема заключается в том, что getSelectedItem can not видит combobox, и мне нужно сообщить ему об этом, но как?

ответ

0

В классе ButtonListener вы не инициализируете gui в конструкторе. Если вы не передаете его каким-либо другим способом, который отсутствует в списке, это null, когда вы обращаетесь к нему в actionPerformed().

Вы можете передать gui и что-нибудь еще в ButtonListener нуждается в конструкторе:

public ButtonListener(Gui gui, Ocean ocean, Go go) { 
    this.gui = gui; 
    this.ocean = ocean; 
    this.go = go; 
} 

Затем, когда вы создаете ButtonListener в Gui классе, вам необходимо предоставить фактические значения:

this.deleteButton.addActionListener(new ButtonListener(
     this, 
     this.oceanPanel.getOcean(), 
     this.go 
)); 

Я предполагаю, что oceanPanel.getOcean() предоставляет экземпляр Ocean - если нет, замените его по мере необходимости.

+0

Так что мне нужно инициализировать gui @ the 'code' (public ButtonListener())? Как я это делаю правильно? –

+0

@ KaiStümer Вы можете передать ссылку на 'gui' или' oceanBoxDelete' на конструктор 'ButtonListener' и установить там личное поле. – Cinnam

+0

Пробовал это, ничего не изменил. Возможно, для этого есть другое решение. Могу ли я подставить 'gui.oceanBoxDelete.getSelectedItem()) каким-либо другим способом или изменить его, чтобы доступ к combobox был доступен, и действительно выбранный объект был прочитан? –

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