0

在我的 JTable 中,更新完成后,需要刷新以显示更改:

public class RecordTableGUI extends JFrame implements ActionListener {
private String newName;
private JTable table;
private RecordTableModel myModel;
private JButton editButton;

    public RecordTableGUI() {
    myModel = new RecordTableModel();
    table = new JTable(myModel);

    add(new JScrollPane(table), BorderLayout.CENTER);
    add(buttonsPanel(), BorderLayout.SOUTH);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(700, 550);
    setLocation(300, 80);
    setVisible(true);
}

public JPanel buttonsPanel() {
    JPanel bPanel = new JPanel();
    editButton = new JButton("Edit");
    editButton.addActionListener(this);
    bPanel.add(editButton);
    return bPanel;
}

@Override
public void actionPerformed(ActionEvent e) {
        if (table.getSelectedRow() > -1) {
        Object oldName = table.getValueAt(table.getSelectedRow(), 1);

        UpdateGUIDialog updDialog = new UpdateGUIDialog(this,String.valueOf(oldName), this);

        int rowToEdit = table.getSelectedRow();
        int rowToModel = table.convertRowIndexToView(rowToEdit);
        Object nameID = table.getValueAt(table.getSelectedRow(), 0);
        myModel.updateRow(rowToModel, nameID, getNewName());
    } else {
        JOptionPane.showMessageDialog(null, "Select a row");
    }
}
}

型号类:

public class RecordTableModel extends AbstractTableModel {
Connection con;
Statement statement;
ResultSet result;
String dbUrl = "jdbc:mysql://localhost/mydb";
String query = "Select * from mytable";
ArrayList<String> cols = new ArrayList<String>();
ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>();

    public RecordTableModel() {
    try {
        con = DriverManager.getConnection(dbUrl, "root", "2323");
        statement = con.createStatement();
        result = statement.executeQuery(query);

        int c = result.getMetaData().getColumnCount();
        for (int i = 1; i <= c; i++) {
            cols.add(result.getMetaData().getColumnName(i));
        }

        while (result.next()) {

            ArrayList<String> eachRow = new ArrayList<String>();
            for (int i = 1; i <= c; i++) {
                eachRow.add(result.getString(i));
            }
            data.add(eachRow);
        }

    } catch (SQLException sqle) {
        sqle.printStackTrace();
    } finally {
        try {
            if (con != null) {
                con.close();
            }
            if (statement != null) {
                statement.close();
            }
        } catch (SQLException sqlee) {
            sqlee.printStackTrace();
        }
    }
}
    @Override
public int getRowCount() {
    return data.size();
}

@Override
public int getColumnCount() {
    return cols.size();
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    ArrayList<String> selectedRow = data.get(rowIndex);
    return selectedRow.get(columnIndex);
}

@Override
public String getColumnName(int col) {
    return cols.get(col);
}
    public void updateRow(int modelRow, Object nameID, Object newName) {
        String query = "update mytable set name = '" + newName + "' where id = " + nameID;
    Connection conn;
    PreparedStatement pstate;
    try {
        conn = DriverManager.getConnection(dbUrl, "root", "2323");
        pstate = conn.prepareStatement(query);
        pstate.executeUpdate();
        fireTableRowsUpdated(tableRow, tableRow);
        fireTableDataChanged();
        fireTableCellUpdated(modelRow, 1);
    } catch (SQLException sql) {
        sql.printStackTrace();
    }
}
4

1 回答 1

3

Here's your original code:

public class RecordTableModel extends AbstractTableModel {
...
    public void updateRow(int modelRow,...) {
    String query = ...;
    Connection conn;
    PreparedStatement pstate;
    try {
        conn = DriverManager.getConnection(...);
        pstate = conn.prepareStatement(query);
        pstate.executeUpdate();
        fireTableRowsUpdated(modelRow, modelRow);     // Not Work!
        fireTableDataChanged();                       // Not Work!
        fireTableCellUpdated(modelRow, 1);           // Not Work!
    } catch (SQLException sql) {
        sql.printStackTrace();
    }
}

This code does nothing to the data held by the table model itself, and so it should come as no surprise that calling fireTableXXX(...) does nothing. If the model is unchanged, you can fire anything you want, and the table won't change.

You should perhaps not be using executeUpdate but executeQuery so you can get a ResultSet from the database, and then use it to update the data held by your table model. Then call your appropriate fireTableXXX(...) method.

于 2013-08-16T22:15:58.020 回答