基本上,我正在开发客户端服务器架构,以便某些客户端可以在外部修改对象。
我有一家银行:
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操作列表中添加一个操作。
问题是:JTable 如何检测并刷新显示?
因为客户端没有使用 TableModel 方法来添加操作。他们无权进入这个类(class)。 最重要的是,我不知道在 TableModel 构造函数中给出银行的整个操作列表是否是一个好主意......
最佳答案
通过让客户访问银行使用的内部列表,您可以允许他们在银行的银行后面做一些事情。有点像真正的银行允许访问其内部数据库,而不是强制所有客户通过网上银行应用程序。
您应该为客户端提供一个接口(interface)的引用,允许他们执行操作。该接口(interface)的实现将控制他们所做的每个操作是否被允许,并执行一切必要的操作。
例如,接口(interface)实现的 addOperation()
方法不仅会将操作添加到操作列表中,还会触发表模型事件,以便表显示此添加的操作手术。
如果银行封装了表模型,这可以直接完成,也可以通过让银行触发自定义“操作添加”事件来间接完成。表模型将监听这些事件,并触发自己的表模型事件以便更新表。
关于java - 扩展 AbstractTableModel 并动态填充 jTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13683306/