Vise od 200 pregleda, a niko nista da prokomentarise ...
No, u medjuvremenu ja isprobavah, kombinovah itd. i napravih nesto. Odustao sam od SQL-a, vec se podaci i dalje pamte u fajlu, ali sada u obliku Vector<Placanja>. Evo kako izgleda TableModel:
Code:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
public class VPModelTabelePlacanja extends AbstractTableModel {
private static final long serialVersionUID = 1L;
protected Vector<Placanje> podaci;
protected Vector<String> naziviKolona;
public VPModelTabelePlacanja() {
initNaziviKolona();
initPodaci();
}
public int getColumnCount() {
return naziviKolona == null ? 0 : naziviKolona.size();
}
public int getRowCount() {
return podaci == null ? 0 : podaci.size();
}
public String getColumnName(int columnIndex) {
return naziviKolona.elementAt(columnIndex).toString();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
public Object getValueAt(int rowIndex, int columnIndex) {
Object result = null;
if (podaci.size() != 0) {
Placanje placanje = podaci.elementAt(rowIndex);
switch (columnIndex) {
case 0:
result = placanje.getRb();
break;
case 1:
result = placanje.getFirma();
break;
case 2:
result = placanje.getBrracuna();
break;
case 3:
result = placanje.getDpo();
break;
case 4:
result = placanje.getValuta();
break;
case 5:
result = placanje.getIznos();
break;
case 6:
result = placanje.getPlaceno();
break;
}
}
return result;
}
public void setValueAt(Object value, int rowIndex, int columnIndex) {
//System.out.println("Setting value at " + rowIndex + "," + columnIndex + " to " + value + " (an instance of " + value.getClass() + ")");
Placanje placanje = podaci.elementAt(rowIndex);
switch (columnIndex) {
case 0:
placanje.setRb((Integer)value);
break;
case 1:
placanje.setFirma((String)value);
break;
case 2:
placanje.setBrracuna((String)value);
break;
case 3:
placanje.setDpo((String)value);
break;
case 4:
placanje.setValuta((String)value);
break;
case 5:
placanje.setIznos((Float)value);
break;
case 6:
placanje.setPlaceno((Boolean)value);
break;
}
podaci.setElementAt(placanje, rowIndex);
fireTableCellUpdated(rowIndex, columnIndex);
}
public Vector<Uplata> getUplate (int index) {
return podaci.elementAt(index).getUplate();
}
public void setUplate (Vector<Uplata> uplate, int index) {
podaci.elementAt(index).setUplate(uplate);
}
public void dodajPlacanje (Placanje placanje) {
int rowIndex = podaci.size();
podaci.addElement(placanje);
fireTableChanged(new TableModelEvent(this, rowIndex, rowIndex, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
}
public void izmeniPlacanje (Placanje placanje, int rowIndex) {
podaci.setElementAt(placanje, rowIndex);
fireTableRowsUpdated(rowIndex, rowIndex);
}
public void obrisiPlacanje (int rowIndex) {
podaci.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
}
public void initNaziviKolona() {
naziviKolona = new Vector<String>();
String[] nazivi = { "RB", "Firma", "Br. racuna", "DPO", "Valuta", "Iznos", "Placeno" };
for (int i=0; i<nazivi.length; i++)
naziviKolona.addElement((nazivi[i]));
}
public void initPodaci() {
(new ProcitajFajl()).execute();
}
private class ProcitajFajl extends SwingWorker<Void, Placanje> {
protected Void doInBackground() {
File fajl;
FileInputStream ulazFile;
ObjectInputStream ulazObject;
Vector<Placanje> podaciIzFajla = null;
try {
fajl = new File ("baze/placanja.dat");
ulazFile = new FileInputStream (fajl);
ulazObject = new ObjectInputStream (ulazFile);
podaciIzFajla = (Vector<Placanje>) ulazObject.readObject();
ulazObject.close();
ulazFile.close();
}
catch (Exception ex) {
JOptionPane.showMessageDialog(VPGUI.frameMain, "<html>Ne postoji baza placanja ili je ostecena.<br>"+ex.getMessage()+"</html>", "Greska", JOptionPane.ERROR_MESSAGE);
}
if (podaci == null)
podaci = new Vector<Placanje>();
for (int i=0; i<podaciIzFajla.size(); i++)
publish(podaciIzFajla.elementAt(i));
return null;
}
protected void process(List<Placanje> delici) {
for (Placanje placanje : delici)
dodajPlacanje(placanje);
}
protected void done() {
VPPlacanja.getInstance().selectLastRow();
VPPlacanja.getInstance().setUkupanDug();
}
}
public void snimiPodatke() {
FileOutputStream izlazFile;
ObjectOutputStream izlazObject;
File fajl;
try {
fajl = new File ("baze/placanja.dat");
izlazFile = new FileOutputStream (fajl);
izlazObject = new ObjectOutputStream (izlazFile);
izlazObject.writeObject(podaci);
izlazObject.close();
izlazFile.close();
}
catch (IOException ioe) {
JOptionPane.showMessageDialog(VPGUI.frameMain, "<html>Neuspesno snimanje podataka u placanja.dat.<br>"+ioe.getMessage()+"</html>", "Greska", JOptionPane.ERROR_MESSAGE);
}
}
}
Podaci se ucitavaju pomocu SwingWorker-a i jedan po jedan red se dodaju u tabelu. Pri izlazu iz programa poziva se metoda snimiPodatke() takodje iz SwingWorker klase.
A evo i kako izgleda klasa Placanja:
Code:
import java.io.Serializable;
import java.util.Vector;
public class Placanje implements Serializable {
private static final long serialVersionUID = 1L;
private Integer rb;
private String firma;
private String brracuna;
private String dpo;
private String valuta;
private Float iznos;
private Boolean placeno;
private Vector<Uplata> uplate;
public Placanje (Integer rb, String firma, String brracuna, String dpo, String valuta, Float iznos, Boolean placeno) {
this.rb = rb;
this.firma = firma;
this.brracuna = brracuna;
this.dpo = dpo;
this.valuta = valuta;
this.iznos = iznos;
this.placeno = placeno;
uplate = new Vector<Uplata>();
}
public Integer getRb() {
return rb;
}
public String getFirma() {
return firma;
}
...
public void setDpo (String dpo) {
this.dpo = dpo;
}
public void setValuta (String valuta) {
this.valuta = valuta;
}
public String toString() {
return "RB: "+rb+"\nFirma: "+firma+"\nBroj racuna: "+brracuna+"\nDPO: "+dpo+"\nValuta: "+valuta+"\nIznos: "+iznos+"\nPlaceno: "+ (placeno == true ? "Da" : "Ne");
}
}
Nego, postoji li resenje za "Type safety: Unchecked cast from Object to Vector<Placanje>" ?
Code:
Vector<Placanje> podaciIzFajla = null;
podaciIzFajla = (Vector<Placanje>) ulazObject.readObject();
Dame biraju uvek pogresne tipove ... Na srecu ...