2012-12-03 41 views
1

我在Netbeans上製作了一個小UI,並且正在實現一個單獨的類中的代碼(Action Listeners等)我試圖刷新存儲在MySql數據庫中的數據的JTable,但是我在運行主類時出現這個錯誤,問題不在於JDBC連接,這工作正常,但它不會將數據打印到JTable。ConcurrentModificationException Netbeans Gui

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) 

編輯:噢,抱歉這裏是調用它的代碼,實際的GUI類是從NetBeans中生成一個和我沒有碰過它,所以除非真的有必要,我不會去張貼那個怪物。

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; 
} 
+2

首先猜測...訪問EDT之外的Swing組件 – Robin

+0

您應該發佈一些代碼。這就像說房子着火了,但你不提供地址。 – wxyz

+0

首先將你的主要方法封裝在'SwingUtilities#invokeLater'中,這樣我們可以排除第一個明顯的線程問題 – Robin

回答

1

在AddressBookImpl.main(AddressBookImpl.java:16)由

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

好吧,我補充說,它不再拋出任何錯誤,但表仍然沒有被填充,但這很可能是另一個問題,謝謝。 只是爲了確認,解決的實際問題是什麼? –

+0

@MATC:更多[這裏](http://stackoverflow.com/a/13666184/230513)表上的問題。 +1另請參見[*初始線程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

1
  1. 訪問MetaData返回信息從行替換當前代碼約Database scheme,不值

  2. MetaData返回ColumnNames對於JTable

  3. 0123以前
  4. 爲什麼((DefaultTableModel) gui.mainTable.getModel()).insertRow(dbi.refreshResult.getRow() -1, rowData);XxxTableModel已經創建,六碼線

  5. 從不使用defaultTableModel.fireTableDataChanged();DefaultTableModel,此通知在DefaultTableModel

  6. myModel()).insertRow (only, everything more is useless)是正確的實現應包裝成invokeLater()JDBC Resultset

  7. 其餘問題(從Database加載數據JTable的實際問題)不可能識別,從代碼發佈在這裏