2015-02-06 6 views
0

내 데이터 구조에서 Excel 스프레드 시트의 이름을 가져온 후 fireTableChanged() 메소드로 JTable을 업데이트하려고하지만 메소드가 실행되지 않습니다. 나는 데이터가 올바르게 임포트되었고 jtable에 필요한 정보가 있어야한다는 것을 확인했다.새로 고침 JTable firetableDataChanged가 실행되지 않았습니다.

JTable이 올바르게 업데이트되었는지 어떻게해야합니까? 나는이 주제에 대한 몇 가지 다른 링크를 발견하지만, 그들 중 누구도 나를 위해 일한 :

Refresh Jtable

How to make JTable show refreshed data after updating database?

JTable How to refresh table model after insert delete or update the data.

AbstractDataTable fireTableDataChanged() does not refresh jtable

Can't refresh my JTable with new data

모델 :

public class Model extends Observable { 
String[][] data; 
List<Arbeitsmappe> AMList = new LinkedList<>(); 
..... 
public void setAMList(List<Arbeitsmappe> aMList) { 
AMList = aMList; //new List replace the old 
this.getData(); //The 2dimensional Array is filled with the names from the list 
setChanged(); 
notifyObservers(Controller.Command_Excel_Eingelesen); 
} 
} 

보기 :

JTextField cellEditorTF = new JTextField(); 
    cellEditorTF.setEditable(false); 
    DefaultCellEditor cellEditor = new DefaultCellEditor(cellEditorTF); 

    ContentTable = new JTable(model.getData(), Model.columnNames); 
    //Cell Editable FALSE 
    ContentTable.getColumnModel().getColumn(0).setCellEditor(cellEditor); 
    //Single Interval Selection 
    ContentTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 
    //Cell Listener - When Cell is edited the new informationen is safed in AMLISt 
    Action action = new AbstractAction() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      TableCellListener tcl = (TableCellListener)e.getSource(); 
      Model.AMList.get(tcl.getRow()).Speichername = String.valueOf(tcl.getNewValue()); 
      // System.out.println("Row: " + tcl.getRow() + " " + Model.data[tcl.getRow()][1]); 
     } 
    }; 
    TableCellListener tcl = new TableCellListener(ContentTable, action); 
    JScrollPane scrollPane = new JScrollPane(ContentTable); 
    ContentTable.setFillsViewportHeight(true); 
    ContentTable.getTableHeader().setReorderingAllowed(false); 

    this.add(BorderLayout.NORTH,ButtonPanel); 
    this.add(BorderLayout.SOUTH,scrollPane); 

} 

@Override 
public void update(Observable arg0, Object arg1) { 
    if(arg0 instanceof Model){ 
     Model model = (Model) arg0; 
     String cmd = (String) arg1; 
     if(cmd.equals(Controller.Command_Excel_Eingelesen)){ 

      ((AbstractTableModel)ContentTable.getModel()).fireTableDataChanged(); 
      ContentTable.repaint(); 
      this.repaint(); 
     } 
    } 
+1

에 대한 올바른 알리미를 사용하는지 확인, 오버라이드 (override) 도움이 될 것입니다. [최소, 완전하고 검증 가능한 예제 프로그램 작성 및 게시] (http://stackoverflow.com/help/mcve) 코드를 압축하여 실행되는 가장 작은 비트로 압축하고 외부 종속성이없는 코드를 작성하십시오 (예 : 데이터베이스 또는 이미지에 연결해야 함), 문제와 관련이없는 추가 코드가 없지만 여전히 probl을 보여줍니다 여자 이름. –

+3

테이블 모델에서'fireXxxx()'메소드를 호출하면 안된다. 이들은 테이블 모델 자체 내에서만 내부적으로 호출되어야합니다. 이렇게하면 디자인이 깨져 보입니다. –

답변

4
  1. ((AbstractTableModel)ContentTable.getModel()).fireTableDataChanged();이 모델 정의에서라고, 그것은 수 should't, AbstractTableModel와 메소드를 오버라이드 (override) 코드의 일부 클래스 무효가 있어야합니다

  2. 이 메서드는 모델에 대한 모든 사용자 지정 속성을 다시 설정하고 JTable (예 : XxxTableCellRenderer/Editor)

  3. read API in part methods for fireTableXxxXxx이 모든 JTable/AbstractTableModel의 라이프 사이클에 대한 신고자가 당신이하지 않으면 또한 현재 모든 활동/이벤트