2013-02-01 35 views
0
private void myProfileTabStateChanged(javax.swing.event.ChangeEvent evt) {           
    if (myProfileTab.getSelectedComponent() == EditProfile) { 
     editProfile(); 
    } else if (SearchAcademic == myProfileTab.getSelectedComponent()) { 
     AcademicDAO aDao = new AcademicDAO(); 
     try { 
      List<AcademicDTO> listAll = aDao.listAll(AcademicDTO.class); 
      searchTable.setData(listAll); 
     } catch (DBException ex) { 
      Logger.getLogger(MainMenu.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 





public class ListDataUI<T extends BaseDTO> extends javax.swing.JPanel { 

    public ListDataUI() { 
     this.summaryColumnsAndTheirViewNames = Collections.emptyMap(); 
     this.dtoSummaryFields = Collections.emptyList(); 
     this.summaryTableModel = new SummaryTableModel(); 
     initComponents(); 
     this.summaryTable.setModel(summaryTableModel); 
     initListeners(); 
    } 

    /** 
    * Creates new form ListDataUI 
    */ 
    public ListDataUI(LinkedHashMap<String, String> summaryColumnsAndTheirViewNames) { 
     this.summaryColumnsAndTheirViewNames = summaryColumnsAndTheirViewNames; 
     this.dtoSummaryFields = new ArrayList<String>(summaryColumnsAndTheirViewNames.keySet()); 
     this.summaryTableModel = new SummaryTableModel(); 
     initComponents(); 
     this.summaryTable.setModel(summaryTableModel); 
     initListeners(); 
    } 

    public ListDataUI(List<String> dtoSummaryFields) { 
     this.summaryColumnsAndTheirViewNames = Collections.emptyMap(); 
     this.dtoSummaryFields = new ArrayList<String>(dtoSummaryFields); 
     this.summaryTableModel = new SummaryTableModel(); 
     initComponents(); 
     this.summaryTable.setModel(summaryTableModel); 
     initListeners(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     tableSp = new javax.swing.JScrollPane(); 
     summaryTable = new javax.swing.JTable(); 

     setLayout(new java.awt.BorderLayout()); 

     summaryTable.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] { 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null}, 
       {null, null, null, null} 
      }, 
      new String [] { 
       "Title 1", "Title 2", "Title 3", "Title 4" 
      } 
     )); 
     tableSp.setViewportView(summaryTable); 

     add(tableSp, java.awt.BorderLayout.CENTER); 
    }// </editor-fold>       
    // Variables declaration - do not modify      
    private javax.swing.JTable summaryTable; 
    private javax.swing.JScrollPane tableSp; 
    // End of variables declaration     
    private List<T> data; 
    private Map<String, String> summaryColumnsAndTheirViewNames; 
    private List<String> dtoSummaryFields; 
    private SummaryTableModel summaryTableModel; 

    public List<T> getData() { 
     return data; 
    } 

    public void removeSelectedDataRow() { 
     final int selectedRow = summaryTable.getSelectedRow(); 
     if (selectedRow != -1) { 
      final int modelIndex = summaryTable.convertRowIndexToModel(selectedRow); 
      data.remove(modelIndex); 
      summaryTableModel.fireTableRowsDeleted(modelIndex, modelIndex); 
     } 
    } 

    public void setData(List<T> data) { 
     this.data = data; 
     summaryTableModel.fireTableDataChanged(); 
     if (data.size() > 0) { 
      summaryTable.getSelectionModel().setSelectionInterval(0, 0); 
     } 
    } 

我試圖顯示錶searchTable中的數據庫中的行數據,我調用setData()方法。我在`searchTable.setData(listAll);'這一行設置了一個斷點,listAll具有來自數據庫的所有數據,但不會在searchTable上顯示。無法用結果填充SummaryTable

+0

SummaryTableModel的源代碼會很好。我想你只是忘記把數據設置到模型中。 –

+0

在哪條線上填充'summaryTable'數據? –

回答

1

問題在於不是你的JTable連接到你的數據的模型。所以你的JTable和它的TableModel完全不知道這個List<T> data

所以基本上你需要有一個TableModel接收你的列表,然後觸發一個合適的TableModelEventTableModel應該實現很少的基本方法,指示如何訪問數據和顯示哪些數據。

查找下面這種實現的一個非常基本的示例(這裏是基於的List顯示名字和姓氏)。它應該是相當簡單的這個適應你的情況:

import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.event.TableModelEvent; 
import javax.swing.table.AbstractTableModel; 

public class TestListTableModel { 

    class MyTableModel extends AbstractTableModel { 

     private List<Person> baseModel; 

     public MyTableModel() { 
      baseModel = new ArrayList<TestListTableModel.Person>(); 
     } 

     public MyTableModel(List<Person> baseModel) { 
      super(); 
      this.baseModel = new ArrayList<Person>(baseModel); 
     } 

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

     @Override 
     public String getColumnName(int column) { 
      switch (column) { 
      case 0: 
       return "First Name"; 
      case 1: 
       return "Last Name"; 
      } 
      return null; 
     } 

     @Override 
     public int getColumnCount() { 
      return 2; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      switch (columnIndex) { 
      case 0: 
       return getPersonAtIndex(rowIndex).getFirstName(); 
      case 1: 
       return getPersonAtIndex(rowIndex).getLastName(); 
      } 
      return null; 
     } 

     public Person getPersonAtIndex(int rowIndex) { 
      return baseModel.get(rowIndex); 
     } 

     public int getIndexOfPerson(Person person) { 
      return baseModel.indexOf(person); 
     } 

     public void addPerson(Person person) { 
      baseModel.add(person); 
      fireTableRowsInserted(baseModel.size() - 1, baseModel.size() - 1); 
     } 

     public void removePerson(Person person) { 
      int removed = baseModel.indexOf(person); 
      if (removed > -1) { 
       baseModel.remove(removed); 
       fireTableRowsDeleted(removed, removed); 
      } 
     } 

     public void setBaseModel(List<Person> baseModel) { 
      this.baseModel = baseModel; 
      fireTableChanged(new TableModelEvent(this)); 
     } 

    } 

    protected void initUI() { 
     List<Person> personModel = new ArrayList<TestListTableModel.Person>(); 
     personModel.add(new Person("John", "Smith")); 
     personModel.add(new Person("Peter", "Donoghan")); 
     personModel.add(new Person("Amy", "Peterson")); 
     personModel.add(new Person("David", "Anderson")); 
     JFrame frame = new JFrame(TestListTableModel.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     MyTableModel tableModel = new MyTableModel(); 
     JTable table = new JTable(tableModel); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setVisible(true); 
     tableModel.setBaseModel(personModel); 
    } 

    public class Person { 
     private final String firstName; 
     private final String lastName; 

     public Person(String firstName, String lastName) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 
    } 

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, 
      UnsupportedLookAndFeelException { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestListTableModel().initUI(); 
      } 
     }); 
    } 

} 
0

首先,你應該創建一個TableModelJTable。數據的任何更新都應該在表模型上完成。

將數據設置爲TableModel。如果每行都是Object,則將對象添加到TableModel列表中。

然後使用setModel方法將模型設置到您的表格。例如:table.setModel(customModel);

P.S:不想DefaultTableModel所有必需的方法,已落實,比去爲AbstractTableModel

+0

我有點不同意你的最後陳述。 AbstractTableModel實現除3個以外的所有方法:'getRowCount','getColumnCount'和'getValueAt',這對我而言非常重要,使用DefaultTableModel也可以,但如果您使用List將浪費你的時間將List轉換爲Vector)。 –

+0

完全同意的轉換需要時間。但我的觀點是'AbstractTableModel'需要顯式地調用'fireXXMethod'rt?所以我想爲什麼要做到這一點,如果有一個'api'那裏已經正確實施它。 – Amarnath