2012-12-03 2 views
0

기본적으로 일부 클라이언트가 객체를 외부 적으로 수정할 수 있도록 클라이언트 서버 아키텍처에서 작업하고 있습니다.AbstractTableModel을 확장하고 jTable을 동적으로 채 웁니다.

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를 호출하여 은행 operationList의 동작을 추가 할 수 있습니다()

나는 은행이있다.

질문 : 어떻게 JTable이 디스플레이를 감지하고 새로 고칠 수 있습니까?

클라이언트가 Operations 추가를 위해 TableModel 메서드를 사용하고 있지 않기 때문에. 그들은이 수업에 접근 할 수 없습니다. 그 외에도 TableModel 생성자에서 Bank의 전체 operationList를주는 것이 좋은 아이디어인지는 모르겠다. ...

답변

1

은행에서 사용하는 내부 목록에 대한 액세스 권한을 클라이언트에 부여하면 그들은 은행의 은행 뒤에 물건을 할 수 있습니다. 실제 은행이 모든 클라이언트가 온라인 은행 응용 프로그램을 통과하도록 강요하는 대신 내부 데이터베이스에 대한 액세스 권한을 부여한 경우와 조금 다릅니다.

클라이언트에게 조작을 수행 할 수있는 인터페이스에 대한 참조를 제공해야합니다. 이 인터페이스의 구현은 허용되는 모든 작업을 제어하고 필요한 모든 작업을 수행합니다.

예를 들어, 인터페이스 구현의 addOperation() 메서드는 작업을 작업 목록에 추가 할뿐만 아니라이 추가 작업을 테이블에 표시하기 위해 테이블 ​​모델 이벤트를 발생시킵니다.

은행이 테이블 모델을 캡슐화하거나 간접적으로 은행에 맞춤 "작업 추가"이벤트를 발생시켜 직접 수행 할 수 있습니다. 테이블 모델은 해당 이벤트를 수신하고 자체 테이블 모델 이벤트를 실행하여 테이블을 업데이트합니다.

+0

효과적으로 연결에 성공하면 클라이언트는 작업을 수행하는 세션 만 제공됩니다. 하지만 세션 생성자에게 은행의 인스턴스를 제공해야합니다. 왜냐하면 효과적으로, 나는 전체 Bank 인스턴스를 클라이언트에 보내지 않지만 Session의 작업 목록에 대해서조차도 작업을 수행해야하므로 Session (Bank bank) 생성자가 있습니다. 테이블 문제에 관해서, 이해한다면, 솔루션은 테이블 모델 자체를 캡슐화하고 ArrayList 작업을 제거하는 것일까 요? (ArrayList는 이미 테이블 모델에 있기 때문에). – xenom

+0

예, 실제로 테이블 모델을 은행에 캡슐화하고 은행을 세션에 캡슐화 할 수 있습니다. 따라서 모든 것이 매우 밀접하게 결합되어 실제 응용 프로그램에는 현실적이지 않지만 아이디어는 그렇게하는 것입니다. 이벤트 및 이벤트 리스너를 사용하면 모든 것을 덜 결합 할 수 있습니다. –

+0

아키텍처가 현실적이지 않다면 차라리 이벤트 및 이벤트 리스너에 대해 알아볼 것입니다. 그러나 나는 그렇게하는 법을 정말로 모른다. Session이 은행을 모르는 경우 어떻게 은행 방법을 호출 할 수 있습니까? – xenom

관련 문제