Reputation: 3
I create the JTable with data contained in an ArrayList and then add the JTable to a JScrollPane
ArrayList<Product> stock = new ArrayList<Product>(s);
String[] col = {"Nombre", "Cantidad", "Descripci\u00F3n", "Contenido"};
DefaultTableModel tableModel = new DefaultTableModel(col,0);
JTable table = new JTable(tableModel);
Collections.sort(stock, new Comparator<Product>() {
public int compare(Product p1, Product p2) {
return p1.getNombre().compareTo(p2.getNombre());
}
});
for (int i = 0; i < stock.size(); i++){
String nombre = stock.get(i).getNombre();
String cantidad = stock.get(i).getCantidad();
String descripcion = stock.get(i).getDescripcion();
String contenido = stock.get(i).getContenido();
Object[] data = {nombre, cantidad, descripcion, contenido};
tableModel.addRow(data);
}
table.getColumnModel().getColumn(0).setPreferredWidth(width*3/18);
table.getColumnModel().getColumn(1).setPreferredWidth(width/9);
table.getColumnModel().getColumn(2).setPreferredWidth(width*8/18);
table.getColumnModel().getColumn(3).setPreferredWidth(width/9);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
table.getTableHeader().setFont(new Font("Arial", Font.BOLD, f));
table.setFont(new Font("Arial", Font.PLAIN, f));
table.setBounds(1, 1, width*8/9, height);
table.setRowHeight(height/30);
table.setEnabled(false);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment( JLabel.CENTER );
for(int i = 0; i<4; i++){
table.getColumnModel().getColumn(i).setCellRenderer( centerRenderer);
}
JScrollPane sp = new JScrollPane(table);
frame.getContentPane().add(sp, BorderLayout.CENTER);
And then through a JButton I modify the contents of the ArrayList, then tell the TableModel that changes have been made and then revalidate() and repaint() the JTable
JButton btnVender = new JButton("Vender");
btnVender.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String n = JOptionPane.showInputDialog("Qué producto quieres vender?");
int x=1;
for(Product p : stock){
if(p.getNombre().equals(n)){
x=0;
String numero = JOptionPane.showInputDialog("Cuántos quieres vender?");
int num = Integer.parseInt(numero);
p.decrementar(num);
tableModel.fireTableDataChanged();
table.revalidate();
table.repaint();
break;
}
}
if(x==1){
JOptionPane.showMessageDialog(null, "No existe ese producto");
}
}
});
The problem is that the JTable won't update but the information does change in the ArrayList
Upvotes: 0
Views: 52
Reputation: 285405
The data for the JTable is not held in the ArrayList but rather resides in the table model itself. Bottom line: don't update the ArrayList but rather the table model itself, here a DefaultTableModel, and your JTable should then display the new data. Fortunately this should be easy to do as the table model has methods that allow you to extract data with getValueAt(...)
and update values in its cells with setValueAt(...)
as well as addRow(...)
if a new row needs to be added.
Note that if you make changes through the DefaultTableModel, there's no need to directly call fireTableDataChanged()
, and in fact you shouldn't call this method -- it's the model's responsibility to do so. Likewise there's no need to revalidate()
or repaint()
your JTable.
Please check out the DefaultTableModel API for the gory details.
If on the other hand you absolutely need to use the ArrayList as a data nucleus for your JTable, then you shouldn't use a DefaultTableModel but rather create your own TableModel by extending AbstractTableModel and using your ArrayList as its data nucleus. If you do this, then your model's code should take care to call the appropriate fire...(...)
method after changing the model's state.
Upvotes: 2