2013-02-12 3 views
0

Эта программа используется для чтения данных из базы данных. В базе данных есть три таблицы pki17, pki18, pkn18. Для просмотра разных таблиц используется JComboBox, и он работает, изменяя TableModel таблицы. Кроме того, используя метод tableChanged, я сделал таблицу доступной для редактирования. Когда значение ячейки в таблице изменяется, соответствующее значение в базе данных должно измениться.Использование таблицы java swing для обновления значений базы данных MySQL

Когда я использую методы tableChanged и actionPerformed вместе, значение в базе данных не изменяется, когда я редактирую ячейку в таблице swing. Когда я удаляю метод 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); 
} 
} 

ответ

1

В конструкторе вы добавляете таблицу модели слушателя к текущей модели только:

table.getModel().addTableModelListener(this); 

В случае действия, однако, заменить модель таблицы:

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

Как следствие, в новой модели таблицы не будет слушателя, и вы больше не будете получать уведомления. Добавьте метод actionPerformed, чтобы добавить слушателя, и ваша проблема должна быть исправлена.

+0

Большое спасибо – user2064898

Смежные вопросы