Matt C
Matt C

Reputation: 147

ConcurrentModificationException Netbeans Gui

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

Answers (2)

mKorbel
mKorbel

Reputation: 109823

  1. access to MetaData returns info about Database scheme, not value from rows

  2. MetaData returns ColumnNames for JTable

  3. why ((DefaultTableModel) gui.mainTable.getModel()).insertRow(dbi.refreshResult.getRow() -1, rowData);, XxxTableModel is already created, six code lines before

  4. never use defaultTableModel.fireTableDataChanged(); for DefaultTableModel, this notifies is proper implemented in DefaultTableModel

  5. myModel()).insertRow (only, everything more is useless) should be wrapped into invokeLater() for JDBC Resultset

  6. rest of issues (real issues to load data for JTable from Database) isn't possible to identifying, from code posted here

Upvotes: 1

Aerospace
Aerospace

Reputation: 1270

at AddressBookImpl.main(AddressBookImpl.java:16) replace the current code by

SwingUtilities.invokeLater( new Runnable(){
   @Override public void run(){ startGUI(); }});

Upvotes: 1

Related Questions