2016-12-20 6 views
0

Будет ли кто-то добрым смотреть на эту простую программу и рассказать мне, что не так с реализацией шаблона проектирования Observer?Образец шаблона наблюдателя. Нужна помощь, чтобы понять, почему это не работает.

Когда я запустил его, в таблице ничего не отображается (показывалось перед реализацией).

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

Мой преподаватель дал нам этот пример программы с шаблоном проектирования Observer ... и, похоже, он не работает!

Программа - это просто данные в данных в jTable.

Я благодарю вас заранее ->here's the complete code

Вот GUI для ввода данных:

package com.employe.listing; 

import java.util.ArrayList; 

public class addEmployeJFrame extends javax.swing.JFrame { 

    ArrayList<addEmployeJFrameObserver> observers = new ArrayList<>(); 

    public addEmployeJFrame() { 
     initComponents(); 

    } 

    public synchronized void addAddEmployeJFrameObserver(addEmployeJFrameObserver observer) { 
     observers.add(observer); 
    } 

    public synchronized void removeAddEmployeJFrameObserver(addEmployeJFrameObserver observer) { 
     observers.remove(observer); 
    } 

    public synchronized void notifyAddEmployeJFrameObserver(Employe e) { 

     for(addEmployeJFrameObserver o : observers) { 
      o.NotifyAddEmployeJFrame(e); 
     } 

    }      

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           

     Employe employe = new Employe(); 
     employe.setName(jTextField1.getText()); 
     employe.setJob(jTextField2.getText()); 
     employe.setSalary(Integer.parseInt(jTextField3.getText())); 
     employe.setYearsAtWork(Integer.parseInt(jTextField4.getText())); 

     notifyAddEmployeJFrameObserver(employe); 
    }           

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JLabel jLabel4; 
    private javax.swing.JLabel jLabel5; 
    private javax.swing.JLabel jLabel6; 
    private javax.swing.JPanel jPanel1; 
    private javax.swing.JPanel jPanel2; 
    private javax.swing.JTextField jTextField1; 
    private javax.swing.JTextField jTextField2; 
    private javax.swing.JTextField jTextField3; 
    private javax.swing.JTextField jTextField4; 
    // End of variables declaration     
} 

Вот контроллер:

package com.employe.listing; 

import java.util.ArrayList; 

public class Controller implements addEmployeJFrameObserver { 

    ArrayList<Employe> employes = new ArrayList<>(); 
    ArrayList<ListingEmployesJFrameObserver> observers = new ArrayList<>(); 
    addEmployeJFrame EmployeJFrame; 
    ListingEmployesJFrame listingJFrame; 

    public Controller() { 

     listingJFrame = new ListingEmployesJFrame(); 
     EmployeJFrame = new addEmployeJFrame(); 
     EmployeJFrame.addAddEmployeJFrameObserver(this); 
     listingJFrame.setVisible(true); 
     EmployeJFrame.setVisible(true); 

    } 

    public synchronized void addListingEmployesJFrameObserver(ListingEmployesJFrameObserver o) { 
     observers.add(o); 
    } 

    public synchronized void removeListingEmployesJFrameObserver(ListingEmployesJFrameObserver o) { 
     observers.remove(o); 
    } 

    public synchronized void notifyListingEmployesJFrameObserver(ArrayList<Employe> employes) { 
     for(ListingEmployesJFrameObserver o : observers) { 
      o.notifyListingEmployesJFrame(employes); 
     } 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     Controller controler = new Controller(); 

    } 

    public void addEmploye(Employe employe) { 

     employes.add(employe); 

     notifyListingEmployesJFrameObserver(employes); 

    } 

    public ArrayList<Employe> getListEmployee() { 
     return employes; 
    } 


    @Override 
    public void NotifyAddEmployeJFrame(Employe e) { 
     this.addEmploye(e); 
    } 
} 

и вот в JTable (данные из) :

package com.employe.listing; 


import java.util.ArrayList; 
import javax.swing.table.AbstractTableModel; 

public class ListingEmployesJFrame extends javax.swing.JFrame implements ListingEmployesJFrameObserver { 

    ArrayList<Employe> employes = new ArrayList<>(); 

    /** 
    * Creates new form ListingEmployesJFrame 
    */ 
    public ListingEmployesJFrame() { 
     initComponents(); 

     AbstractTableModel model = new AbstractTableModel() { 

      @Override 
      public String getColumnName(int column) { 
       if(column == 0) { 
        return "Name"; 
       } else if(column == 1) { 
        return "Job"; 
       } else if(column == 2) { 
        return "Salary"; 
       } else { 
        return "Years"; 
       } 
      } 

      @Override 
      public int getRowCount() { 
       return employes.size(); 
      } 

      @Override 
      public int getColumnCount() { 
       return 4; 
      } 

      @Override 
      public Object getValueAt(int rowIndex, int columnIndex) { 

       if(columnIndex == 0) { 
        return employes.get(rowIndex).getName(); 
       } else if(columnIndex == 1) { 
        return employes.get(rowIndex).getJob(); 
       } else if(columnIndex == 2) { 
        return employes.get(rowIndex).getSalary(); 
       } else { 
        return employes.get(rowIndex).getYearsAtWork(); 
       } 
      } 
     }; 

     jTable1.setModel(model); 
    } 


    // Variables declaration - do not modify      
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTable jTable1; 
    // End of variables declaration     

    @Override 
    public void notifyListingEmployesJFrame(ArrayList<Employe> employes) { 
     this.employes = employes; 
     jTable1.updateUI(); 
    } 

} 

ответ

0

Я не вижу нигде в вашем коде, где вы звоните addListingEmployesJFrameObserver(), чтобы зарегистрировать наблюдателя, поэтому нет уведомлений.

Update конструктор вашего Controller.java как показано ниже:

public Controller() { 
    listingJFrame = new ListingEmployesJFrame(); 
    EmployeJFrame = new addEmployeJFrame(); 
    EmployeJFrame.addAddEmployeJFrameObserver(this); 

    listingJFrame.setVisible(true); 
    EmployeJFrame.setVisible(true); 

    // * add the line below to register listingJFrame as an observer * 
    addListingEmployesJFrameObserver(listingJFrame); 
} 

Edit: Стоит отметить, что вызов addListingEmployesJFrameObserver() не рекомендуется. См. What's wrong with overridable method calls in constructors? для более подробного объяснения.

+0

Большое вам спасибо ... Я боролся с этим, и учитель никогда не беспокоился отвечать за свою ошибку! –