我創建的JTable與包含在一個ArrayList的數據,然後添加JTable中JScrollPane中無法更新JTable中的信息
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);
然後通過一個JButton我修改的ArrayList內容,然後告訴TableModel的是已經作了修改,然後重新驗證()和重繪()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");
}
}
});
的問題是,JTable中不會更新,但信息的確ArrayList中變化
謝謝,我不得不改變ArrayList中的值,因爲它們內部的對象是序列化和反序列化的,但是使用setValueAt()更改表中的值有效。 – ErickQ
@ErickQ:不客氣,但如果您創建並使用並行數據集合(ArrayList和TableModel),則會冒險。如果這是我的問題,我會創建方法來序列化和反序列化我的模型的數據核,這可以通過'getDataVector()'獲得,或者使用ArrayList作爲AbstractTableModel的核心。 –