1

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;
}
Matt C
  • 137
  • 1
  • 3
  • 15
  • 2
    First guess ... accessing Swing components outside the EDT – Robin Dec 03 '12 at 11:27
  • you should post some code. it's like saying a house is on fire, but you don't provide the address. – wxyz Dec 03 '12 at 11:27
  • Start by wrapping your main method in a `SwingUtilities#invokeLater` so we can exclude the first obvious threading issue – Robin Dec 03 '12 at 11:39
  • 1
    When I run the gui class as the main method the error does not occur, so perhaps it is a threading issue. – Matt C Dec 03 '12 at 11:51

2 Answers2

1

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

SwingUtilities.invokeLater( new Runnable(){
   @Override public void run(){ startGUI(); }});
Aerospace
  • 1,270
  • 12
  • 19
  • Ok I added that and it's no longer throwing up any errors, but the table still isn't being populated, but that's most likely another problem thanks. Just for confirmation, what was the actual issue that that solved? – Matt C Dec 03 '12 at 11:57
  • @MattC: More [here](http://stackoverflow.com/a/13666184/230513) on the table problem. +1 See also [*Initial Threads*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod Dec 03 '12 at 17:04
1
  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

mKorbel
  • 109,525
  • 20
  • 134
  • 319