Only the last Vector instance of rowData in loadDefaultTableModel is actually being displayed in the actual JTable. Why is that?
Other vectors, with other data, are being instantiated but are not getting added to the model -- apparently. At least they are not being displayed.
How do I ensure that the model contains the desired data? The desired data is output by the Logger, and is in Vector form already. I do not understand the inconsistency.
package net.bounceme.dur.nntp.swing;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Vector;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import net.bounceme.dur.nntp.gnu.PageMetaData;
import net.bounceme.dur.nntp.gnu.Page;
import net.bounceme.dur.nntp.gnu.Usenet;
public class ArticlesTable extends JScrollPane {
private static final Logger LOG = Logger.getLogger(ArticlesTable.class.getName());
private static final long serialVersionUID = 1L;
private JTable jTable = new JTable();
private DefaultTableModel defaultTableModel = new DefaultTableModel();
private Page page;
private Usenet usenetConnection = Usenet.INSTANCE;
public ArticlesTable() throws Exception {
page = new Page();//eh, throws Exception -- fix later
LOG.fine(page.toString()); //empty Page
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
defaultTableModel = new DefaultTableModel(new Object[][]{
{"some", "text"}, {"any", "text"}, {"even", "more"},
{"text", "strings"}, {"and", "other"}, {"text", "values"}},
new Object[]{"Column 1", "Column 2"});
jTable.setModel(defaultTableModel);
jTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
jTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
itemSelected();
}
});
jTable.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
itemSelected();
}
});
setSize(2000, 2000); //not sure these lines are quite right, but ok for now
setViewportView(jTable);
jTable.setVisible(true);
setVisible(true);
}
private void itemSelected() {
int row = jTable.getSelectedRow();
int column = 0;
Object selectedObject = jTable.getValueAt(row, column);
int i = (int) selectedObject;
Map<Integer, Message> messages = page.getMessages();
Message message = messages.get(i);
firePropertyChange("message", null, message);
}
public final void nextPage() throws Exception {
LOG.fine("trying to get next page..." + page);
PageMetaData pageMetaData = page.getPageMetaData();
pageMetaData.next(); //only changes meta data
page = usenetConnection.getPage(pageMetaData); //fetches actual data
LOG.fine("was the page advanced?" + page); //yes, logs show this
loadDefaultTableModel();
LOG.fine(page.toString());
}
@SuppressWarnings("unchecked")
private void loadDefaultTableModel() throws MessagingException {
LOG.fine("trying to load...");
defaultTableModel = new DefaultTableModel();
defaultTableModel.addColumn("index");
defaultTableModel.addColumn("message subject");
Vector rowData = new Vector(); //vector?! nothing better?
Message message = null;
Map<Integer, Message> messages = page.getMessages(); //sort this
int key = 0;
LOG.info("trying to traverse..." + messages.size()); //page meta data determines the size
for (Entry<Integer, Message> entry : messages.entrySet()) {
rowData.clear();
key = entry.getKey();
message = messages.get(key);
rowData.add(key);
rowData.add(message.getSubject());
LOG.info("vector\t" + key + "\t" + message.getSubject());
//the vector logs the data which **should** get added
//to the table model
defaultTableModel.addRow(rowData); //adds same row over and over
}
jTable.setModel(defaultTableModel);
}
private Message getMessage(int i) {
LOG.fine("trying to get\t\t" + i);
Map<Integer, Message> messages = page.getMessages();
Message m = messages.get(i);
return m;
}
}
image:
and some of the output:
INFO: trying to traverse...5
Apr 15, 2013 2:05:13 AM net.bounceme.dur.nntp.swing.ArticlesTable loadDefaultTableModel
INFO: vector 25 Re: Netbeans question?
Apr 15, 2013 2:05:13 AM net.bounceme.dur.nntp.swing.ArticlesTable loadDefaultTableModel
INFO: vector 27 Re: Helpppp plzzz
Apr 15, 2013 2:05:13 AM net.bounceme.dur.nntp.swing.ArticlesTable loadDefaultTableModel
INFO: vector 26 Re: writing Unix files on Windows
Apr 15, 2013 2:05:13 AM net.bounceme.dur.nntp.swing.ArticlesTable loadDefaultTableModel
INFO: vector 29 JTextPane.modelToView() exception
Apr 15, 2013 2:05:13 AM net.bounceme.dur.nntp.swing.ArticlesTable loadDefaultTableModel
INFO: vector 28 Java 6 update 39 to 41 balloon
As can be seen, each vector instance has the correct data. However, only the first instance seems to end up in the GUI output. Why?
Is it not getting added to the model correctly? Is the model not updating the table correctly?
Why is the data in the model, as seen in the GUI, mismatched from the logged output?