2014-09-09 2 views
1

이 질문을 여러 번 검색하여 본 적이 있지만 해결 방법이 없습니다.AbstractTableModel에 적절한 데이터가 있지만 fireTablDataChanged에서 업데이트되지 않습니다

저는 이라는 확장 된 AbstractTableModel을 가지고 있습니다. 코드가 그대로입니다.

import InvAcntItem.Account; 
import java.util.LinkedList; 
import javax.swing.table.AbstractTableModel; 

public class AccountTableModel extends AbstractTableModel 
{ 
    LinkedList<Account> dataList; 
    private String[] columnNames = {"Username", "Password"}; 

    public AccountTableModel() 
    { 
     dataList = new LinkedList<>(); 
    } 

    public void setNewAccounts(LinkedList<Account> inAccs) 
    { 
     System.out.println("Syncing local account"); 
     LinkedList<Account> newList = new LinkedList<>(); 
     for(int i = 0; i < inAccs.size(); i++) 
      newList.add(Account.getDeepCopy(inAccs.get(i))); 
     System.out.println("done"); 
     this.dataList = newList; 
     System.out.println("set"); 
     this.fireTableDataChanged(); 
     System.out.println("set"); 
    } 

    @Override 
    public int getRowCount() 
    { 
     return dataList.size(); 
    } 

    @Override 
    public int getColumnCount() 
    { 
     return columnNames.length; 
    } 

    @Override 
    public Object getValueAt(int col, int row) 
    { 
     System.out.println("GetValueAt!"); 
     Object retObj = null; 
     Account rowAcc = dataList.get(row); 
     switch(col) 
     { 
      case 0: 
      { 
       retObj = rowAcc.user; 
      } 
      break; 
      case 1: 
      { 
       retObj = rowAcc.pass; 
      } 
      break; 
     } 
     return retObj; 
    } 
} 

println 문이 모두 실행되지만 UI는 업데이트되지 않습니다. 나는 지금까지 테이블 모델 fireDataChanged을 호출 할 때 버튼을 만들 때까지갔습니다.

또한 getValueAt 함수를 호출하고 좋은 데이터를 반환합니다.

테이블을 다시 그리지 않게 할 다른 것이 있습니까?

+1

image

은 아마도 당신은 내가 분명히 다른 뭔가 잘못이 EDT 스레드 –

답변

3

특히, getValueAt()을 구현하면 행과 열이 서로 바뀝니다. 이를 수정하고 가짜 Account 데이터를 추가하는 것이 효과가있는 것처럼 보입니다.

import java.awt.EventQueue; 
import java.util.LinkedList; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 

/** 
* @see http://stackoverflow.com/a/25736893/230513 
*/ 
public class Test { 

    private static class Account { 

     public Account() { 
     } 
    } 

    class AccountTableModel extends AbstractTableModel { 

     LinkedList<Account> dataList = new LinkedList<>(); 
     private String[] columnNames = {"Username", "Password"}; 

     public void setNewAccounts(LinkedList<Account> inAccs) { 
      dataList.clear(); 
      dataList.addAll(inAccs); 
      this.fireTableDataChanged(); 
     } 

     @Override 
     public int getRowCount() { 
      return dataList.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return columnNames.length; 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      Account account = dataList.get(row); 
      if (col == 0) { 
       return account.getClass(); 
      } 
      if (col == 1) { 
       return account.hashCode(); 
      } 
      return null; 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     AccountTableModel model = new AccountTableModel(); 
     LinkedList<Account> list = new LinkedList<>(); 
     list.add(new Account()); 
     list.add(new Account()); 
     list.add(new Account()); 
     model.setNewAccounts(list); 
     f.add(new JScrollPane(new JTable(model))); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      new Test().display(); 
     }); 
    } 
} 
+0

에 그 일을하지 않습니다. 노력해 주셔서 감사합니다. – KDecker

+0

'TableModel'에서'LinkedList'를 사용하여 다시 생각해보십시오; 각각의'get()'은리스트의 절반까지 트래버스 할 수 있습니다. – trashgod

관련 문제