2016-12-20 6 views
0

この単純なプログラムを見てオブザーバーデザインパターンの実装に何が間違っているか教えてもらえますか?オブザーバーデザインパターン - これがうまくいかない理由を理解するのに助けが必要です

私はそれを実行すると、(実装の前に表示されていた)テーブルに何も表示されません。

私はちょうどデザインパターンを学ぶようになったので、それをどのようにデバッグするのか分かりません。

私の先生は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()を呼び出してオブザーバーを登録しているわけではないので、通知するものはありません。

アップデート下記のお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); 
} 

編集:それはaddListingEmployesJFrameObserver()を呼び出すことはお勧めではないことを指摘しておきます。詳細はWhat's wrong with overridable method calls in constructors?を参照してください。

+0

ありがとうございました...私はその1つに苦労していて、教師は決して戻ってくる気にならなかった...自分の間違いのために! –

関連する問題