ConcurrentModificationException Netbeans Gui

时间:2012-12-03 11:21:38

标签: java swing user-interface jtable

我在Netbeans上做了一个小UI,并且已经在一个单独的类(Action Listeners等)中实现了代码。我试图用存储在MySql数据库中的数据刷新JTable,但是我收到了这个错误在运行主类时,问题不在于JDBC连接,而是工作正常,但它不会将数据打印到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)

编辑:是的抱歉这里是调用它的代码,实际的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 个答案:

答案 0 :(得分:1)

在AddressBookImpl.main(AddressBookImpl.java:16)替换当前代码

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

答案 1 :(得分:1)

  1. 访问MetaData会返回有关Database scheme的信息,而不是来自行的值

  2. MetaData返回ColumnNames的{​​{1}}

  3. 为什么JTable((DefaultTableModel) gui.mainTable.getModel()).insertRow(dbi.refreshResult.getRow() -1, rowData);已经创建,之前有六个代码行

  4. 从不对XxxTableModel使用defaultTableModel.fireTableDataChanged();,此通知已在DefaultTableModel

  5. 中正确实施 对于DefaultTableModel

  6. myModel()).insertRow (only, everything more is useless)应该包含在invokeLater()

  7. 其他问题(从JDBC Resultset加载JTable数据的实际问题)无法通过此处发布的代码进行识别