我正在尝试创建一个可以过滤的表但是我的表模型类中的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
答案 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
构造函数中,并更好地组织代码以避免这种情况:
JTable
“当我插入或删除一个时,我应该只调用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);
}
}
...
}