2013-02-25 5 views
1

Я обновил базу данных, и я хотел бы обновить JTable с помощью этого кода, привязанного к событию с нажатием кнопки, но он не работает. Когда я закрываю аппликацию и снова ее открываю, JTable показывает правильные данные.Как сделать JTable показать обновленные данные после обновления базы данных?

Нужно ли переопределить какой-либо метод на моей абстрактной таблице?

try { 
     model=new MyTableModel(this.database); 
     table = new JTable(model); 
    } catch (SQLException e) { 

     e.printStackTrace(); 
    } 

scrollPane = new JScrollPane(table); 

refresh.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 

     ((MyTableModel)table.getModel()).fireTableDataChanged(); 

    } 
}); 

class MyTableModel extends AbstractTableModel { 
    private int i; 
    private String[] columnNames = { "ID", "Code", "Country", "Radio", 
      "primljeno", "select" }; 

    private Object[][] data = { { new Integer(0), "", "", "", "", 
      new Boolean(false) } }; 

    public MyTableModel(My_class_Database database)throws SQLException { 
      init(database); 


    } 
    public void init(My_class_Database database) throws SQLException 
    { 
     this.i = database.checkIsDataThere(); 
     Object[][] object; 
     if (i == 0) { 
      object = new Object[i][7]; 
      object = database.getDatafromDatabase(this.i); 
      this.data = object; 
      dataAp = object; 

     } else { 
      object = database.getDatafromDatabase(this.i); 
      textField.setText("No data in database"); 
     } 

    } 

    public int getColumnCount() { 
     return columnNames.length; 
    } 

    public int getRowCount() { 
     return data.length; 
    } 

    public Object getValueAt(int row, int col) { 
     return data[row][col]; 

    } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    public void setValueAt(Object value, int row, int col) { 

     data[row][col] = value; 
     fireTableCellUpdated(row, col); 

    } 

    // problem sa null vrijednostima,null exception 
    public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     if (col > 4) { 
      return true; 
     } else 
      return (false); 
    } 

} 
+1

Одним из способов является считывание всех данных из базы данных и создание новой TableModel. Затем вы можете использовать метод JTable.setModel(). – camickr

+0

Это сработало, спасибо! –

+0

Трудно сказать без кода. Пожалуйста, отправьте сообщение по адресу [SSCCE] (http://www.sscce.org) и сообщите нам об этом. –

ответ

1

Как это (размещен код), модель не знает об изменениях в базе данных. Вы можете либо обновить данные в модели, например, вызвать существующий метод init(), либо создать аналогичный. В качестве альтернативы вы можете создать новую модель и сбросить ее на стол.

Данная модель несет ответственность за предотвращение таких уведомлений, как fireTableDataChanged, которые вы используете в actionPerformed. Клиенты таблицы не должны выполнять эти методы. fireTableDataChanged относится к способу init(). См. Firing Data Change Events для получения более подробной информации и примеров.

Модель должна быть о данных, поэтому лучше всего, если вы переместите логику установки textField вне модели. При необходимости вы можете предоставить дополнительные методы из модели, чтобы помочь клиентам получить дополнительную информацию о данных и состоянии.

1

Этот link содержит похожие обсуждения, которые могут быть именно тем, что вы ищете. Ответ пользователя «nkvnkv» имеет интересную концепцию.

Cheers.

0

Пробовал много вещей, но в конце концов это работало для меня:

if (model.getRowCount() > 0) { 
     for (int i = model.getRowCount() - 1; i > -1; i--) { 
      model.removeRow(i); 
     } 
    } 

    setTablevalue(); 

Я удалил все строки из JTable и снова называют метод setTableValue повторно заполнить таблицу.

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