2014-07-14 2 views
0

JTable에 이상한 문제가 있습니다. 방법 addRows는보기를 업데이트 할 jTable을 강요하지 않습니다DefaultTableModel에 새로운 행을 추가 할 때 JTable이 뷰를 업데이트하지 않는 이유는 무엇입니까?

public class VirusTable extends JTable { 

    private String[] columnNames = { "", "Virus", "Path", "Size", "Created", "Last Mofified" }; 

    DefaultTableModel tableModel; 

    public VirusTable() { 
     super(); 

     tableModel = (DefaultTableModel) super.getModel(); 
     tableModel.setColumnIdentifiers(columnNames); 

     // super.setFillsViewportHeight(true); 
     // super.setIntercellSpacing(new Dimension(5, 5)); 
     // super.setRowSelectionAllowed(false); 
     // super.setColumnSelectionAllowed(false); 
    } 

    public void addRows(Collection<UserFile> viruses) { 
     System.out.println("AddRows=" + viruses); 

     for (UserFile virus : viruses) { 
      tableModel.addRow(virus.toRowData()); 
     } 
//  tableModel.fireTableDataChanged(); 
     // tableModel.fireTableStructureChanged(); 
     int rowCount = super.getRowCount(); 
//  super.revalidate(); 
//  super.repaint(); 
     System.out.println("rowCount=" + rowCount); 
    } 
} 

addRows 방법은 SwingWorker.process 방법에서 호출됩니다. 흥미롭게도 rowCount은 항상 올바르지 만 행은 JTable에 표시되지 않습니다.

나는 모든 것을 시도했지만 아무 도움이되지 않습니다. 짧은 실행 가능한 데모를 만들고 싶었지만이 버그를 구현할 수 없습니다.

이 프로젝트 on github을 게시하고 무슨 문제가 있는지 설명했습니다.

+1

짧은 데모에서 버그를 구현할 수없는 경우 버그가 다른 곳에서 발생하고 있습니까? –

+0

jTable에서보기를 새로 고칠 수없는 것을 제안 할 수 있습니까? –

+2

'jTable이보기를 새로 고치는 것을 막을 수있는 방법을 제안 해 주시겠습니까? '아마도 JTable 인스턴스가 두 개있을 수 있습니다. 하나는 GUI에 추가하고 다른 하나는 데이터를 업데이트하려고 시도한 것입니다. 적절한 'SSCCE'가 없다면 그것은 단지 야생의 추측 일뿐입니다. – camickr

답변

1

camickr이 정확합니다. 실제로는 VirusTable의 두 인스턴스 (사실 MainFrame도 있지만 그 중 하나만 표시됨)가 만들어집니다. 기본적으로 하나의 인스턴스 만 만들 수있는 제약이 없지만 기본적으로 싱글 톤으로 전환하여 MainFrame 객체에 액세스하는 방법을 제공했습니다. IMHO, Mainframe 클래스에 정적 getInstance 메서드를 만들지 않고도이 작업을 훨씬 더 잘 수행 할 수있었습니다.

어쨋든, 당신의 주요 방법으로이 작업을 수행 :

public static void main(String[] args) throws IOException { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      new MainFrame().setVisible(true); 
     } 
    }); 
} 

그러나 때문에 응용 프로그램을 코딩 한 방식, 당신이 (필자는이 방법을 권장하지 않는 것이) 일을해야

:

public static void main(String[] args) throws IOException { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      MainFrame.getInstance().setVisible(true); 
     } 
    }); 
} 

감사합니다.

+0

나는 모든 것을 볼 수 없다! 고맙습니다 ! –

0

아마도 이벤트 발송 스레드가 아닌 다른 스레드에서 스윙 모델을 변경하고 있습니까? 모든 Swing 상호 작용은 EDT에서 수행해야합니다. 따라서 SwingUtilities.invokeLater()에서 테이블 업데이트를 래핑하거나 (각 항목이 발견 될 때 업데이트하려는 경우) done() 메소드의 테이블 모델에 항목을 추가하십시오. EDT에서 실행을 강제하는 SwingWorker.

+0

'DefaultTableModel' 메소드가'SwingWorker.process' 메소드에서 호출되었습니다. –