Reputation: 3
I wrote a personal TableModel
that takes data from db.
The problem is when I modify data in the table , I could see the effect
on the table but no table event succeds. It seems like the method
setValueAt
doesn't make an event, but I can see he update the cell of table.
Obviusly I add in the main program these codes.
i added these to show that it doesnt work
Stabili.java (the sourceof data from db)
package entity;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
@Entity
@Table(catalog = "", schema = "ROOT")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Stabili.findAll", query = "SELECT s FROM Stabili s"),})
public class Stabili implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(nullable = false)
private Long id;
@Basic(optional = false)
@Column(nullable = false, length = 50)
private String indirizzo;
public Stabili() {
}
public Stabili(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getIndirizzo() {
return indirizzo;
}
public void setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (!(object instanceof Stabili)) {
return false;
}
Stabili other = (Stabili) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "entity.Stabili[ id=" + id + " ]";
}
}
// the tablemodel StabiliTableModel.java
package prova;
import entity.Stabili;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.swing.event.EventListenerList;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class StabiliTableModel implements TableModel, TableModelListener{
protected EventListenerList listenerList = new EventListenerList();
private final EntityManager em;
private final TypedQuery<Stabili> qry;
private final List<Stabili> results;
public StabiliTableModel(EntityManager em){
this.em = em;
qry = em.createNamedQuery("Stabili.findAll",Stabili.class);
results = qry.getResultList();
}
@Override
public int getRowCount() {
return results.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int columnIndex) {
switch (columnIndex){
case 0:
return "Id";
case 1:
return "Indirizzo";
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex){
case 0:
return results.get(rowIndex).getId();
case 1:
return results.get(rowIndex).getIndirizzo();
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
switch (columnIndex){
case 1:
results.get(rowIndex).setIndirizzo(aValue.toString());
}
fireTableCellUpdated(rowIndex,columnIndex);
}
@Override
public void addTableModelListener(TableModelListener l) {
}
@Override
public void removeTableModelListener(TableModelListener l) {
}
@Override
public void tableChanged(TableModelEvent e) {
System.out.println(e.getColumn());
}
public void fireTableDataChanged(){
fireTableChanged(new TableModelEvent(this, 0, Integer.MAX_VALUE));
}
public void fireTableStructureChanged(){
fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
}
public void fireTableRowsInserted(int firstRow, int lastRow){
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS,
TableModelEvent.INSERT));
}
public void fireTableRowsUpdated(int firstRow, int lastRow){
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS,
TableModelEvent.UPDATE));
}
public void fireTableRowsDeleted(int firstRow, int lastRow)
{
fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
TableModelEvent.ALL_COLUMNS,
TableModelEvent.DELETE));
}
public void fireTableCellUpdated(int row, int column)
{
fireTableChanged(new TableModelEvent(this, row, row, column));
}
public void fireTableChanged(TableModelEvent event){
int index;
TableModelListener listener;
Object[] list = listenerList.getListenerList();
for (index = 0; index < list.length; index += 2){
listener = (TableModelListener) list [index + 1];
listener.tableChanged(event);
}
}
}
// and finally the main
package prova;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Prova extends JFrame{
private JTable mainTable,fixedTable;
private JScrollPane scrollPane;
private JTableHeader mainTableHeader;
private TableColumnModel originalColumnModel,mainColumnModel,fixedColumnModel;
private TableColumn[] columns;
private int ncols,counter;
private EntityManager em;
public Prova(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("provaPU");
em = emf.createEntityManager();
StabiliTableModel mainTableModel = new StabiliTableModel(em);
scrollPane = new JScrollPane();
mainTable = new JTable(mainTableModel);
mainTableModel.addTableModelListener(mainTableModel);
scrollPane.setViewportView(mainTable);
add(scrollPane, BorderLayout.CENTER);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Prova().setVisible(true);
}
});
}
}
Upvotes: 0
Views: 359
Reputation: 205775
As suggested here, the preferred approach is to extend AbstractTableModel
and fire a suitable TableModelEvent
in your implementation of setValueAt()
. DefaultTableModel
is an example.
I don't want to extend
AbtractTableModel
.
Some alternatives:
Delegate to a subclass of AbtractTableModel
in your StabiliTableModel
.
Add an instance of EventListenerList
as a member of StabiliTableModel
and fire your own events using the scheme outlined in the EventListenerList
API.
There is not something that fire the event, but I don't know what.
Exactly; you'll need to use the existing event mechanism or create your own.
Upvotes: 1