java - 无法使用结果填充 SummaryTable

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

最佳答案

问题不在于连接到数据的 JTable 模型。所以你的 JTable 及其 TableModel 绝对不知道 List<T> data .

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

下面是此类实现的一个非常基本的示例(此处基于 ListPerson 来显示名字和姓氏)。根据您的情况进行调整应该非常简单:

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

}

关于java - 无法使用结果填充 SummaryTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650096/

相关文章:

java - 用于选择并显示数组项的 J 按钮

ios - 按钮到底部的自动布局

c# - 在 Surface Pro 3 中开发 WinForm 应用程序时出现 GUI 预览大小问题

c++ - 检查 Qt 是否可以使用键盘和鼠标

java - 我可以使用Cucumber测试使用多种语言的应用程序吗?

java.io.FileNotFoundException :/storage/emulated/0/Android/data/MyApplication/MyFile. ICS。 (没有这样的文件或目录)/Android Studio/Ical4j

Java Swing 使用多个包/类

java - 应用程序关闭时 FCM 推送通知不起作用 Android

java - 更新到7.7.0后,ElasticSearch在MacOS上不起作用

java - 创建表时 JFrame 中的组件不出现