我一直在为jtable getrowcount()方法获取nullpointer异常

时间:2014-07-21 13:48:49

标签: java swing jtable jpanel tablemodel

我正在尝试创建一个可以过滤的表但是我的表模型类中的getRowCount()方法一直得到一个空指针异常。

HomePagePanel(我的桌子在哪里)

public class homepagePanel extends JPanel implements ActionListener {
private JButton uploadEmail, viewEmail, logout, delete;
private JLabel userLog;
private JLabel tableLabel;
private JScrollPane scrollPane;
private EmailTableListener emailTableListener;
//private EmailTablePanel EmailPanel;
private HomePagePanelListener homepagePanelListener;
private List<Item> dc;
private Controller controller;
private JTable table;
private EmailTableModel emailModel;
private JPopupMenu popup;
private JTextField filterText;
private JLabel filterLabel;
private TableRowSorter<EmailTableModel> sorter;




public homepagePanel() {



    controller = new Controller();

    userLog = new JLabel("Logged in:");

    uploadEmail = new JButton("Upload");
    viewEmail = new JButton("View");
    delete = new JButton("Delete");
    logout = new JButton("Log Out");
    tableLabel = new JLabel("Emails stored");

    //Email stuff
    emailModel = new EmailTableModel();
    sorter = new TableRowSorter<EmailTableModel>(emailModel);
    table = new JTable(emailModel);
    table.setRowSorter(sorter);

    //
    filterLabel = new JLabel("Filter Text: ", SwingConstants.TRAILING);
    filterText = new JTextField(10);
    filterLabel.setLabelFor(filterText);

    //documenet listener
    filterText.getDocument().addDocumentListener(new DocumentListener(){

        @Override
        public void changedUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            newFilter();
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            newFilter();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            newFilter();
        }
     });






    // Adds the table to a scrollpane
    scrollPane = new JScrollPane(table);
    scrollPane
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    popup = new JPopupMenu();

    JMenuItem removeItem = new JMenuItem("Delete row");
    popup.add(removeItem);


    //adds mouse listener to show 
    table.addMouseListener(new MouseAdapter(){

        public void mousePressed(MouseEvent e) {
            int row = table.rowAtPoint(e.getPoint());
            table.getSelectionModel().setSelectionInterval(row, row);
            if(e.getButton() == MouseEvent.BUTTON3){
                popup.show(table, e.getX(), e.getY());//shows popup

            }
        }

    });
    //removeitem actionlistener
    removeItem.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            int row = table.getSelectedRow();

            if(emailTableListener != null){
                emailTableListener.rowDeleted(row);
                emailModel.fireTableRowsDeleted(row, row);
            }
        }

    });
    // EmailPanel = new EmailTablePanel();



    layoutComponents();

    viewEmail.addActionListener(this);
    uploadEmail.addActionListener(this);
    logout.addActionListener(this);

private void newFilter(){
    RowFilter<EmailTableModel, Object> rf = null;

    try{
        rf = RowFilter.regexFilter(filterText.getText());
    }catch(java.util.regex.PatternSyntaxException e){
        return;
    }
    sorter.setRowFilter(rf);
}

的TableModel

package view;

import java.util.List;

import javax.swing.table.AbstractTableModel;

import model.Item;

public class EmailTableModel extends AbstractTableModel {

private List<Item> dc;
private String[] colNames = {"ID", "To", "From", "Subject", "Topic", "Message Content", "Comments", "Attachments"};

public EmailTableModel(){
    //System.out.println(dc.size());
}

public String getColumnName(int column) {
    // TODO Auto-generated method stub
    return colNames[column];
}


public void setData(List<Item> dc){
    this.dc = dc;
}
@Override
public int getColumnCount() {
    // TODO Auto-generated method stub
    return 8;
}

@Override
public int getRowCount() {
    // TODO Auto-generated method stub
    return dc.size();
}

@Override
public Object getValueAt(int row, int column) {
    Item item = dc.get(row);

    switch(column){
    case 0: 
        return item.getId();
    case 1:
        return item.getTo();
    case 2:
        return item.getFrom();
    case 3:
        return item.getSubject();
    case 4:
        return item.getTopic();
    case 5:
        return item.getMessageContent();
    case 6:
        return item.getComments();
    case 7:
        return item.getAttachments();

    }
    return null;
}

public Class getColumnClass(int column) {
    Class returnValue;
    // Verifying that the column exists(index > 0 && index < number of
    // columns
    if ((column >= 0) && (column < getColumnCount())) {
        returnValue = getValueAt(0, column).getClass();
    } else {
        // Returns the class for the item in the column
        returnValue = Object.class;
    }
    return returnValue;
};

}

数据库类(为jtable重新获取数据)

    public void loadItems() throws SQLException {
    //connects to the database
    getConnected();
    Items.clear();//clears the linked list
    String sql = "Select Id, Reciever, Sender, Subject, topic, Email_Content, Comments, Attachments from item order by Id";//querly for select statement
    Statement selectStatement = con.createStatement();
    ResultSet results = selectStatement.executeQuery(sql);

    while (results.next()) {
        int id = results.getInt("Id");
        String To = results.getString("Reciever");
        String From = results.getString("Sender");
        String Subject = results.getString("Subject");
        String topic = results.getString("topic");
        String Email_Content = results.getString("Email_Content");
        String Comments = results.getString("Comments");
        String Attachments = results.getString("Attachments");

        Item item = new Item(id, To, From, Subject, topic, Email_Content,
                Comments, Attachments);
        Items.add(item);//add item to linked list

    }

}

大型机(我设置数据的地方

loadItems(); //method used to load the data from the database
HomepagePanel.setData(controller.getItems());//sets data 

1 个答案:

答案 0 :(得分:0)

下面:

public class HomePagePanel { // note code conventios!
    ...
    public HomePagePanel() {
        ...
        emailModel = new EmailTableModel();
        sorter = new TableRowSorter<EmailTableModel>(emailModel);
        table = new JTable(emailModel);
        ...
    }
}

在创建表格之前,您没有立即调用emailModel.setData()。这意味着您的表模型的数据永远不会被初始化,此时dc仍然为空。因此,在getRowCount()创建期间调用JTable方法时,它会抛出您正面临的NPE。

恕我直言,你应该考虑删除setData()方法并将项目列表添加到EmailTableModel构造函数中,并更好地组织代码以避免这种情况:

  1. 执行数据库调用并获取项目列表
  2. 创建新的表格模型
  3. 新建JTable

  4. 修改

      

    “当我插入或删除一个时,我应该只调用fireTableDataChanged   项?“

    不,您只需要提供方法来向表模型添加/删除项目,然后通知TableModelListener有关此类事件的信息。例如:

    public class EmailTableModel extends AbstractTableModel {
        ...
        public void addRow(Item item) {
            int rowIndex = dc.size();
            dc.add(item);
            fireTableRowsInserted(rowIndex, rowIndex);
        }
        ...
        public void deleteRow(Item item) {
            int rowIndex = dc.indexOf(item);
            if(rowIndex > -1) {
                dc.remove(item);
                fireTableRowsDeleted(rowIndex, rowIndex);
            }
        }
        ...
    }
    

    请参阅AbstractTableModel API