0

基本上,我正在研究客户端服务器架构,因此某些客户端可以在外部修改对象。

我有一家银行:

public class Bank{
    private List<BankingOperation> operationList = new ArrayList<BankingOperation>();

    public void addOperation(BankingOperation op) {
        this.operationList.add(op);
//...
}

我的服务器:

public class ServerBank extends JFrame {
    private Bank bank;
    private JTable table;
    private OperationTableModel model;

    public ServerBank() {
        this.bank = new Bank();
        this.model= new OperationTableModel(this.bank.getOperationList());
        table = new JTable(model);
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        pack();
    }

    public static void main (String args[]) throws Exception {

        ServerBank frame=new ServerBank();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800,700);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);


    }
    class OperationTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 1L;
    private List<BankingOperation> operationList;
    public String[] colNames = { "Date", "Login", "Customer","Account", "Operation", "Amount", "Final Balance" };
    public Class<?>[] colTypes = { String.class, String.class, String.class, String.class, String.class, Integer.class,
            Integer.class };


    public OperationTableModel(List<BankingOperation> operationList) {
        super();
        this.operationList = operationList;
    }//...
}

客户可以通过调用 addOperation() 在 Bank operationList 中添加一个 Operation。

问题是:JTable 如何检测并刷新显示?

因为客户端没有使用 TableModel 方法来添加操作。他们无权访问此类。最重要的是,我不知道在 TableModel 构造函数中给出银行的整个 operationList 是否是一个好主意......

4

1 回答 1

1

通过让客户访问银行使用的内部列表,您允许他们在银行的银行后面做事。有点像一家真正的银行允许访问其内部数据库,而不是强迫所有客户通过在线银行应用程序。

您应该为客户端提供对允许他们执行操作的接口的引用。这个接口的实现将控制他们所做的每一个操作都是被允许的,并且做所有必要的事情。

例如,addOperation()接口实现的方法不仅会将操作添加到操作列表中,还会触发表模型事件以使表显示此添加的操作。

如果银行封装了表格模型,这可以直接完成,或者通过让银行触发自定义的“添加操作”事件间接完成。表模型将监听这些事件,并触发它自己的表模型事件以更新表。

于 2012-12-03T12:41:55.420 回答