无法用结果填充摘要表


    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上。

问题在于您的 JTable 模型连接到您的数据。所以你的JTable和它的表模型完全不知道这个List<T> data

所以基本上你需要有一个TableModel来接收你的列表,然后触发一个适当的TableModelEventTableModel应实现很少的基本方法来指示如何访问数据以及要显示哪些数据。

在下面找到这种实现的一个非常基本的示例(这里它基于显示名字和姓氏的Person 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();
            }
        });
    }
}

首先,您应该为JTable创建一个表模型。对数据的任何更新都应在表模型上完成。

将数据设置为TableModel 。如果每一行都是Object则将对象添加到"表模型"列表中。

然后使用setModel方法将模型设置为表中。例如:table.setModel(customModel);

PS:更喜欢已经实现所有必需方法的DefaultTableModel,而不是使用AbstractTableModel。

相关内容

  • 没有找到相关文章

最新更新