观察者设计模式 - 需要帮助才能理解为什么这不起作用

Observer Design Pattern - Need help to understand why this is not working

哪位好心人可以看看这个简单的程序并告诉我观察者设计模式的实现有什么问题?

当我运行它时,table没有任何显示(在执行前显示)。

我刚开始学习设计模式,所以我不确定如何调试它。

我的老师给了我们这个使用观察者设计模式的程序示例...但它似乎不起作用!

该程序只是 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();
    }

}

我在你的代码中没有看到你调用 addListingEmployesJFrameObserver() 来注册观察者的任何地方,所以有 none 来通知。

如下所示更新 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?