Reputation: 147
I've made a small UI on Netbeans, and have am implementing the code in a seperate class (Action Listeners etc.) I am trying to refresh the JTable with data stored in a MySql database, however I am getting this error when running the main class, the problem is not with the JDBC connection, that's working fine, however it is not printing the data to the JTable.
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
at com.sun.java.swing.plaf.nimbus.NimbusStyle.compileDefaults(NimbusStyle.java:378)
at com.sun.java.swing.plaf.nimbus.NimbusStyle.validate(NimbusStyle.java:297)
at com.sun.java.swing.plaf.nimbus.NimbusStyle.getValues(NimbusStyle.java:927)
at com.sun.java.swing.plaf.nimbus.NimbusStyle.getInsets(NimbusStyle.java:605)
at javax.swing.plaf.synth.SynthStyle.installDefaults(SynthStyle.java:896)
at javax.swing.plaf.synth.SynthLookAndFeel.updateStyle(SynthLookAndFeel.java:275)
at javax.swing.plaf.synth.SynthLabelUI.updateStyle(SynthLabelUI.java:53)
at javax.swing.plaf.synth.SynthLabelUI.installDefaults(SynthLabelUI.java:48)
at javax.swing.plaf.basic.BasicLabelUI.installUI(BasicLabelUI.java:307)
at javax.swing.JComponent.setUI(JComponent.java:662)
at javax.swing.JLabel.setUI(JLabel.java:242)
at javax.swing.JLabel.updateUI(JLabel.java:256)
at javax.swing.table.DefaultTableCellRenderer.updateUI(DefaultTableCellRenderer.java:144)
at javax.swing.JLabel.<init>(JLabel.java:145)
at javax.swing.JLabel.<init>(JLabel.java:216)
at javax.swing.table.DefaultTableCellRenderer.<init>(DefaultTableCellRenderer.java:94)
at sun.swing.table.DefaultTableCellHeaderRenderer.<init>(DefaultTableCellHeaderRenderer.java:32)
at javax.swing.table.JTableHeader.createDefaultRenderer(JTableHeader.java:610)
at javax.swing.table.JTableHeader.initializeLocalVars(JTableHeader.java:632)
at javax.swing.table.JTableHeader.<init>(JTableHeader.java:138)
at javax.swing.JTable.createDefaultTableHeader(JTable.java:5586)
at javax.swing.JTable.initializeLocalVars(JTable.java:5520)
at javax.swing.JTable.<init>(JTable.java:614)
at javax.swing.JTable.<init>(JTable.java:540)
at AddressBookGui.initComponents(AddressBookGui.java:29)
at AddressBookGui.<init>(AddressBookGui.java:16)
at AddressBookImpl.refreshTable(AddressBookImpl.java:33)
at AddressBookImpl.startGUI(AddressBookImpl.java:26)
at AddressBookImpl.main(AddressBookImpl.java:16)
Edit: Yeah sorry here is the code that's calling it, the actual GUI class is a generated one from Netbeans and I haven't touched it, so unless it's really necessary I'm not going to post that monster.
public class AddressBookImpl extends AddressBookGui implements ActionListener {
public static void main(String[] args) {
AddressBookImpl impl = new AddressBookImpl();
impl.startGUI();
impl.listeners();
}
public void startGUI(){
AddressBookGui gui = new AddressBookGui();
gui.main(null);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setResizable(true);
this.setTitle("Address Book");
refreshTable();
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public DefaultTableModel refreshTable() {
AddressBookGui gui = new AddressBookGui();
try{
DatabaseImpl dbi = new DatabaseImpl();
dbi.refreshDatabase();
DefaultTableModel defaultTableModel = new DefaultTableModel();
ResultSetMetaData md = dbi.refreshResult.getMetaData();
int columnCount = md.getColumnCount();
while(dbi.refreshResult.next())
{
Object [] rowData = new Object [columnCount];
for (int i = 0; i < columnCount; i++)
{
rowData[i] = dbi.refreshResult.getObject(i+1);
}
((DefaultTableModel) gui.mainTable.getModel()).insertRow(dbi.refreshResult.getRow() -1, rowData);
}
defaultTableModel.fireTableDataChanged();
return defaultTableModel;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
Upvotes: 1
Views: 659
Reputation: 109823
access to MetaData
returns info about Database scheme
, not value from rows
MetaData
returns ColumnNames
for JTable
why ((DefaultTableModel) gui.mainTable.getModel()).insertRow(dbi.refreshResult.getRow() -1, rowData);
, XxxTableModel
is already created, six code lines before
never use defaultTableModel.fireTableDataChanged();
for DefaultTableModel
, this notifies is proper implemented in DefaultTableModel
myModel()).insertRow (only, everything more is useless)
should be wrapped into invokeLater()
for JDBC Resultset
rest of issues (real issues to load data for JTable
from Database
) isn't possible to identifying, from code posted here
Upvotes: 1
Reputation: 1270
at AddressBookImpl.main(AddressBookImpl.java:16) replace the current code by
SwingUtilities.invokeLater( new Runnable(){
@Override public void run(){ startGUI(); }});
Upvotes: 1