无法使用结果填充SummaryTable

时间:2013-02-01 15:55:25

标签: java swing user-interface jtable tablemodel

    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上没有显示。

2 个答案:

答案 0 :(得分:1)

问题不在于您的JTable模型是否与您的数据相关联。所以你的JTable及其TableModel完全不知道List<T> data

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

在下面找到这种实现的一个非常基本的示例(这里它基于List Person来显示名字和姓氏。根据您的情况调整它应该非常简单:

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();
            }
        });
    }

}

答案 1 :(得分:0)

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

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

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

P.S:首选DefaultTableModel所有必需的方法,而不是AbstractTableModel