簡體   English   中英

使用Java Swing表更新MySQL數據庫值

[英]Using java swing table to update MySQL database values

該程序用於從數據庫讀取數據。 在數據庫中,有三個表pki17,pki18,pkn18。 為了查看不同的表,使用了JComboBox,它通過更改表的TableModel來工作。 同樣通過使用tableChanged方法,我使表格可編輯。 當表中的單元格值更改時,數據庫中的相應值也必須更改為。

當我同時使用tableChanged和actionPerformed方法時,當我在回轉表中編輯單元格時,數據庫中的值不會更改。 當我刪除actionPerformed方法時,可以通過編輯表格單元來更新數據庫。

我需要同時具備兩種能力,即使用JComboBox從數據庫中選擇一個表,並通過編輯Swing表中的值來更新數據庫值。

我認為存在問題是因為兩種方法都更改了表的TableModel。 但是我不知道如何解決。

public class TableCombobox extends JPanel implements ActionListener, TableModelListener  {
static JTable table;
static JComboBox box;
static MyTableModel model;
static Connection con = null;
static Statement stmt = null;

public TableCombobox() throws SQLException {
    super(new BorderLayout());
    table = new JTable(new MyTableModel("pki18"));
    table.setPreferredScrollableViewportSize(new Dimension(500, 400));
    table.setFillsViewportHeight(true);
    table.getModel().addTableModelListener(this);

    JScrollPane scrollPane = new JScrollPane(table);

    JPanel menuPanel = new JPanel();
    menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));
    menuPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1,
            Color.black));

    String[] dalykas = { "Chose groop", "pki17", "pki18", "pkn18" };
    box = new JComboBox(dalykas);
    box.setMaximumSize(new Dimension(150, 25));
    box.setAlignmentX(Component.LEFT_ALIGNMENT);
    box.addActionListener(this);
    box.setSelectedIndex(2);

    menuPanel.add(box);

    JPanel cards = new JPanel(new CardLayout());
    cards.add(scrollPane, "view");
    add(menuPanel, BorderLayout.LINE_START);
    add(cards, BorderLayout.CENTER);
}
public void tableChanged(TableModelEvent e) {
    int row = e.getFirstRow();
    int col = e.getColumn();
    model = (MyTableModel) e.getSource();
    String stulpPav = model.getColumnName(col);
    Object data = model.getValueAt(row, col);
    Object studId = model.getValueAt(row, 0);
    System.out.println("tableChanded works");
    try {
        new ImportData(stulpPav, data, studId);
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
}

public void actionPerformed(ActionEvent event) {        
        JComboBox cb = (JComboBox) event.getSource();
        String pav = (String) cb.getSelectedItem();
        if (pav != "Chose groop") {
            try {
                model = new MyTableModel(pav);
                table.setModel(model);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

private static void GUI() throws SQLException {
    JFrame frame = new JFrame("E-gradebook");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setContentPane(new TableCombobox());
    frame.pack();
    frame.setSize(800, 400);
    frame.setVisible(true);
}

public static void main(String[] args) throws SQLException {
    try {

        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost/pki18",
                "root", "");
        GUI();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
    } finally {
        if (stmt != null)
            stmt.close();
    }
}

static Connection getConnection() {
    return con;
}
}


public class ImportData {
static Connection con = TableCombobox.getConnection();

public ImportData(String a, Object b, Object c)
        throws ClassNotFoundException, SQLException {
    Statement stmt = null;
    try {

        String stulpPav = a;
        String duom = b.toString();
        String studId = c.toString();
        System.out.println(duom);
        con.setAutoCommit(false);
        stmt = con.createStatement();
        stmt.addBatch("update pki18 set " + stulpPav + " = " + duom
                + " where studento_id = " + studId + ";");
        stmt.executeBatch();
        con.commit();
    } catch (BatchUpdateException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (stmt != null)
            stmt.close();
        con.setAutoCommit(true);
        System.out.println("Data was imported to database");
    }
}   
}


public class MyTableModel extends AbstractTableModel{
static int rowCount;
static Object data [][];
static String columnNames [];

public  MyTableModel(String grupName) throws SQLException{
    String query ="select Studento_id, vardas_pavarde, 1_semestras,"+
            " 2_semestras, egzaminas, bendras_balas "+
            "from pki18." + grupName;

    ResultSet rs ;
    Connection con = TableCombobox.getConnection();

    Statement stmt = null;
    stmt = con.createStatement();
    rs = stmt.executeQuery(query);

    rs.last();
    rowCount = rs.getRow();
    data = new Object[rowCount][6];
    rs = stmt.executeQuery(query);
    for (int iEil = 0; iEil < rowCount; iEil++){
        rs.next();                  
        data[iEil][0] = rs.getLong("Studento_id");
        data[iEil][1] = rs.getString("Vardas_Pavarde");
        data[iEil][2]  = rs.getByte("1_semestras");
        data[iEil][3] = rs.getByte("2_semestras");
        data[iEil][4]  = rs.getByte("Egzaminas");
        data[iEil][5] = rs.getByte("bendras_balas");                    
    }

     String[] columnName  = {"Asmens_kodas","Vardas_Pavarde","1_Semestras"
            ,"2_Semestras","Egzaminas","Bendras_Balas"};
     columnNames = columnName;
}   
public int getColumnCount(){
    return columnNames.length;
}
public int getRowCount(){
    return data.length;
}
public String getColumnName(int col){
    return columnNames[col];
}
public Object getValueAt(int row, int col){
    return data[row][col];
}
public Class getColumnClass(int col){
    return getValueAt(0, col).getClass();
}
public boolean isCellEditable(int row, int col){
    return true;
}
public void setValueAt(Object value, int row, int col){
    data[row][col] = value;
    fireTableCellUpdated(row, col);
}
}

在構造函數中,僅將表模型偵聽器添加到當前模型中:

 table.getModel().addTableModelListener(this); 

但是,在操作事件中,您將替換表模型:

 model = new MyTableModel(pav); table.setModel(model); 

結果,新的表模型將沒有偵聽器,並且您將不再收到通知。 actionPerformed方法也添加偵聽器,並且應該解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM