Java 扩展AbstractTableModel并动态填充jTable

Java 扩展AbstractTableModel并动态填充jTable,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,基本上,我正在开发一个客户机-服务器体系结构,这样一些客户机就可以在外部修改对象 我有一家银行: public class Bank{ private List<BankingOperation> operationList = new ArrayList<BankingOperation>(); public void addOperation(BankingOperation op) { this.operationList.add(

基本上,我正在开发一个客户机-服务器体系结构,这样一些客户机就可以在外部修改对象

我有一家银行:

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

    public void addOperation(BankingOperation op) {
        this.operationList.add(op);
//...
}
公共类银行{
私有列表操作列表=新建ArrayList();
公共作废添加操作(BankingOperation op){
此操作列表添加(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;
    }//...
}
public类ServerBank扩展JFrame{
私人银行;
专用JTable表;
私人经营表模式;
公共银行(){
this.bank=新银行();
this.model=新的OperationTableModel(this.bank.getOperationList());
表=新JTable(型号);
getContentPane().add(新的JScrollPane(表),BorderLayout.CENTER);
包装();
}
公共静态void main(字符串args[])引发异常{
ServerBank frame=newserverbank();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架设置尺寸(800700);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
类操作TableModel扩展了AbstractTableModel{
私有静态最终长serialVersionUID=1L;
私有列表操作列表;
公共字符串[]colNames={“日期”、“登录”、“客户”、“帐户”、“操作”、“金额”、“最终余额”};
public Class[]colTypes={String.Class,String.Class,String.Class,String.Class,Integer.Class,
Integer.class};
公共操作表模型(列表操作列表){
超级();
this.operationList=operationList;
}//...
}
客户端可以通过调用addOperation()在银行操作列表中添加操作

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

因为客户端未使用TableModel方法添加操作。他们无权访问此类。
除此之外,我不知道在TableModel构造函数中提供银行的整个操作列表是否是一个好主意…

通过让客户访问银行使用的内部列表,您可以让他们在银行的银行后面做事情。这有点像一家真正的银行提供了对其内部数据库的访问,而不是强制执行所有cli通过网上银行的申请

您应该为客户端提供一个接口的引用,该接口允许客户端执行其操作。该接口的实现将控制客户端执行的每个操作都是允许的,并执行所有必要的操作

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


如果银行封装了表模型,这可以直接实现,也可以通过让银行触发自定义的“添加操作”间接实现事件。表模型将侦听这些事件,并触发自己的表模型事件,以便更新表。

实际上,只有在连接成功的情况下,客户端才能获得一个会话来执行其操作。但我必须向会话构造函数提供一个银行实例,对吗?因为实际上,我没有将整个银行实例发送给客户机,但即使对于会话中的操作列表,我们也必须对某些内容执行操作,因此我有一个构造函数会话(银行);关于表问题,如果我理解,解决方案将是封装表模型本身并删除操作的ArrayList?(因为ArrayList已经在表模型中)。是的,您确实可以将表模型封装到库中,将库封装到会话中。这使得所有内容都非常紧密地耦合,对于实际应用程序来说并不现实,但我们的想法是这样做。使用事件和事件侦听器将使整件事情不那么耦合。如果架构不现实,我宁愿选择事件和事件监听器。但我真的不明白怎么做。因为如果会话不知道银行,它怎么能调用银行方法?看看JButton是如何工作的。它对你的应用程序一无所知。但当你点击它时,它会调用你的应用程序的一个方法,你自己实现了它。之所以这样做是因为你的应用程序阳离子向按钮添加listener,单击按钮时按钮调用此侦听器。对银行和会话执行相同操作:银行向会话添加listener。操作完成后,会话将启动一个事件。银行从会话接收通风,并更新其表模型。问题是银行不是服务器。I事实上,服务器实例化了一家银行,也实例化了会话。这就是银行不知道会话的原因。你认为最好将服务器合并为银行本身吗?如果我这样做,我或多或少了解如何处理基本的银行操作和侦听器。但是关于余额检索或帐户列表?如何你是否需要一个聆听者?会议将对银行说“客户想要他/她的信息”,但你如何获得回报值?