Gestion de fichier

Cet article est la suite de l’article Client Java JWT
Dans cet article nous allons voir comment modifier notre précédente application Java et y ajouter la gestion de fichier via l’API.
Nous allons premièrement implémenter plusieurs objets correspondant aux différentes fenêtres « Facture« , « Banque« , « Compte« , « Réconciliation » et « Catégorie« .
Pour chaque table, on va créer une classe nomClassePane qui contiendra :
-une fonction initialize() créant une JTable pouvant afficher les données selon le « modèle » de l’objet nomClasseModel (grâce à la fonction setModel()). Mais qu’est ce qu’un modèle ? C’est ici, la source des données pour cette vue. On verra après comment implémenter ce modèle.
-une fonction refresh() qui récupère les nouvelles données de la table concernée à l’aide d’un GET, puis actualise graphiquement la JTable.
-les getters des champs de la classe.
Deuxièmement, pour implémenter un objet nomClasseModel, il faut une classe qui « extends » TableModel. Or, il existe 2 classes qui implémentent l’interface TableModel : DefaultTableModel et AbstractTableModel. Contrairement à la méthode « Default » qui manipule les données avec une structure vector, « Abstract » donne la possibilité de stocker les données librement. Toutefois, on devra implémenter les méthodes qui permettent d’interagir avec une JTable.
Pour pouvoir au minimum lire les données et les afficher sur la table, 3 méthodes doivent être overridées :
- public int getRowCount(): renvoie le nombre de lignes.
- public int getColumnCount(): renvoie le nombre de colonnes.
- public Object getValueAt(int ligne, int colonne): retourne l’objet dans la case (ligne, colonne).
Par la suite, d’autres getters et setters sont overridées pour supprimer ou modifier la table en question. Cela est fait en manipulant une ArrayList du type de l’objet concerné, typographié ObjNomObjet (exemple : ObjBank pour BankTableModel).
La fonction addLine() permet l’envoi d’une nouvelle ligne sur la table au serveur, la fonction parse() est appelée lorsqu’un GET est effectué (notifié par le PropertyChange). Lorsqu’un POST est effectué, un élément est ajouté à l’ArrayList.
Voici un exemple complet avec la section « Banque » de l’application :
BankPane :
public class BankPane{
private JTable table = null;
private BankTableModel bankTableModel = null;
private JScrollPane scrollPane = null;
public BankPane(){
super();
initialize();
}
private void initialize() {
table = new JTable();
bankTableModel = new BankTableModel();
table.setModel(bankTableModel);
table.setAutoCreateRowSorter(true);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
scrollPane = new JScrollPane(table);
scrollPane.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
public void refresh(){
bankTableModel.refreshObj();
table.updateUI();
}
public JTable getBankTable() {return table;}
public JScrollPane getBankScrollPane() {return scrollPane;}
public BankTableModel getBankTableModel() {return bankTableModel;}
}
BankTableModel :
public class BankTableModel extends AbstractTableModel implements PropertyChangeListener{
private static final long serialVersionUID = 1L;
private String[] columnNames = {"Id", "IdAccount", "Categorie", "Designation", "Date", "Debit", "Credit", "Tva"};
private ArrayList listObjs = new ArrayList();
private ConnectionRest connectionRest = null;
private ObjBank objTmp = null;
public BankTableModel(){
super();
}
public void addLine(File file){
try {
JSONObject jsonObj = new JSONObject();
objTmp = new ObjBank();
jsonObj.put("account_id", objTmp.getIdAccount());
jsonObj.put("category", objTmp.getCategory());
jsonObj.put("designation", objTmp.getDesignation());
jsonObj.put("date_add", objTmp.getDateAdd());
jsonObj.put("debit", objTmp.getDebit());
jsonObj.put("credit", objTmp.getCredit());
jsonObj.put("amount_tva", objTmp.getAmountTva());
connectionRest = new ConnectionRest("POST");
connectionRest.setObj(jsonObj);
connectionRest.setAction("bank");
connectionRest.addPropertyChangeListener(this);
connectionRest.start();
} catch (JSONException e) {
e.printStackTrace();
}
}
public void refreshObj() {
connectionRest = new ConnectionRest("GET");
connectionRest.setAction("bank");
connectionRest.addPropertyChangeListener(this);
connectionRest.start();
}
private ArrayList<ObjBank> parse(String json) {
try {
if (!json.equals("")) {
ArrayList<ObjBank> listObj = new ArrayList<ObjBank>();
final JSONArray jSonArray = new JSONArray(json);
for (int i = 0; i < jSonArray.length(); i++) {
listObj.add(new ObjBank(jSonArray.optJSONObject(i)));
}
return listObj;
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getSource().equals(connectionRest)){
if(evt.getPropertyName().equals("GET")){
listObjs = parse((String)evt.getNewValue());
}else if(evt.getPropertyName().equals("POST")){
String newID = (String)evt.getNewValue();
if(newID.charAt(0)!='{'){ // POUR la gestion des UPDATE
int id = Integer.parseInt(newID.trim());
objTmp.setId(id);
if(listObjs == null) {
listObjs = new ArrayList<ObjBank>();
}
listObjs.add(objTmp);
}
}
connectionRest.removePropertyChangeListener(this);
fireTableChanged(null); // Dis aux classes qui écoutent qu'une nouvelle table est arrivé.
}
}
@Override
public void setValueAt(Object value, int row, int column) {
try {
ObjBank obj = null;
if(row < listObjs.size()){
obj = listObjs.get(row);
switch (column) {
case 1:
obj.setDesignation((String) value);
break;
default:
break;
}
//Envoie le fichier qui a ete modifier
listObjs.set(row, obj);
JSONObject jsonObj = new JSONObject();
jsonObj.put("id",obj.getId());
jsonObj.put("account_id", obj.getIdAccount());
jsonObj.put("category", obj.getCategory());
jsonObj.put("designation", obj.getDesignation());
jsonObj.put("date_add", obj.getDateAdd());
jsonObj.put("debit", obj.getDebit());
jsonObj.put("credit", obj.getCredit());
jsonObj.put("amount_tva", obj.getAmountTva());
connectionRest = new ConnectionRest("PUT");
connectionRest.setObj(jsonObj);
connectionRest.setAction("bank");
connectionRest.addPropertyChangeListener(this);
connectionRest.start();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public Class<? extends Object> getColumnClass(int c) {
if(getValueAt(0, c)!=null){
return getValueAt(0, c).getClass();
}else{
return null;
}
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
if (columnNames[column] != null) {
return columnNames[column];
} else {
return "";
}
}
@Override
public int getRowCount() {
if (listObjs!=null)
return listObjs.size();
else
return 0;
}
@Override
public Object getValueAt(int aRow, int aColumn) {
ObjBank obj = null;
if(listObjs!=null && aRow<listObjs.size()){
obj = listObjs.get(aRow);
}
if(obj!= null){
return obj.elementAt(aColumn);
}else{
return null;
}
}
@Override
public boolean isCellEditable(int row, int column) {
if (column == 1){
return true;
}
return false;
}
public ObjBank get(int gRow) {
return listObjs.get(gRow);
}
public void remove(int gRow) {
try {
objTmp = (ObjBank)listObjs.get(gRow);
JSONObject jsonObj = new JSONObject();
jsonObj.put("id",objTmp.getId());
connectionRest = new ConnectionRest("DELETE");
connectionRest.setObj(jsonObj);
connectionRest.setAction("bank");
connectionRest.start();
listObjs.remove(gRow);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
ObjBank :
public class ObjBank {
private int id;
private int idAccount;
private String category;
private String designation;
private String dateAdd;
private double debit;
private double credit;
private double amount_tva;
public ObjBank() {
id = -1;
idAccount = -1;
category = "catégorie";
designation = "désignation";
Date date = new Date();
SimpleDateFormat simpleDateFormatCible = new SimpleDateFormat("dd/MM/yyyy");
dateAdd = simpleDateFormatCible.format(date);
debit = 0.0;
credit = 0.0;
amount_tva = 0.0;
}
public ObjBank(JSONObject jObject) {
id = jObject.optInt("id");
idAccount = jObject.optInt("account_id");
category = jObject.optString("category");
designation = jObject.optString("designation");
dateAdd = jObject.optString("date_add");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat simpleDateFormatCible = new SimpleDateFormat("dd/MM/yyyy");
try{
Date date = simpleDateFormat.parse(dateAdd);
dateAdd = simpleDateFormatCible.format(date);
}catch (ParseException ex){
System.out.println("Exception "+ex);
}
debit = jObject.optDouble("debit");
credit = jObject.optDouble("credit");
amount_tva = jObject.optDouble("amount_tva");
}
public Object elementAt(int pNumColonne){
switch (pNumColonne) {
case 0:
return getId();
case 1:
return getIdAccount();
case 2:
return getCategory();
case 3:
return getDesignation();
case 4:
return getDateAdd();
case 5:
return getDebit();
case 6:
return getCredit();
case 7:
return getAmountTva();
default:
return null;
}
}
public int getId() { return id; }
public int getIdAccount() { return idAccount; }
public String getCategory() {return category;}
public String getDesignation() {return designation;}
public String getDateAdd() { return dateAdd; }
public double getDebit() {return debit;}
public double getCredit() {return credit;}
public double getAmountTva() {return amount_tva;}
public void setId(int pId) { id=pId; }
public void setIdAccount(int pIdAccount) { idAccount=pIdAccount; }
public void setCategorie(String pCategory) {category = pCategory;}
public void setDesignation(String pDesignation) {designation = pDesignation;}
public void setDateAdd(String pDateAdd) { dateAdd=pDateAdd; }
public void setDebit(double pDebit) {debit = pDebit;}
public void setCredit(double pCredit) {credit = pCredit;}
public void setAmountTva(double pAmountTva) {amount_tva = pAmountTva;}
}
Par la suite, il faut que RestJFrame gère les bouttons (actionPerformed()) et soit au courant des actions effectuées (PropertyChange()) lors d’un envoi via ConnectionRest (ou d’une connection/inscription) :
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(boutonAdd)) {
showOpenFileDialog();
}else if (e.getSource().equals(boutonDel) && uploadPane.getUploadTable().getSelectedRow()>-1) {
uploadPane.getUploadTableModel().remove(uploadPane.getUploadTable().getSelectedRow());
}else if(e.getSource().equals(boutonGet) && uploadPane.getUploadTable().getSelectedRow()>-1) {
uploadPane.getUploadTableModel().refreshProduct(uploadPane.getUploadTable().getSelectedRow());
}else if(e.getSource().equals(boutonRefresh)) {
uploadPane.getUploadTableModel().refreshProducts();
}
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
if(evt.getSource().equals(loginJDialog)&&evt.getPropertyName().equals("AuthorizationOk")){
Param.getIns().setToken((String)evt.getNewValue());
uploadPane.refresh();
bankPane.refresh();
accountPane.refresh();
reconcilationPane.refresh();
categoryPane.refresh();
}else if(evt.getSource().equals(loginJDialog)&&evt.getPropertyName().equals("Register")){
registerJDialog.setVisible(true);
}else if(evt.getSource().equals(registerJDialog)&&evt.getPropertyName().equals("AuthorizationOk")){
Param.getIns().setToken((String)evt.getNewValue());
uploadPane.refresh();
bankPane.refresh();
accountPane.refresh();
reconcilationPane.refresh();
categoryPane.refresh();
}else if(evt.getSource().equals(registerJDialog)&&evt.getPropertyName().equals("Login")){
loginJDialog.setVisible(true);
}
}
Enfin, visuellement parlant, il faut que les nouvelles tables soient visibles et rendre fonctionnels les boutons de refresh(), d’ajout de fichiers (showOpenFileDialog()), d’inscription et de GET.
private void initialize() {
try {
registerJDialog = new RegisterJDialog(this);
registerJDialog.addPropertyChangeListener(this);
uploadPane = new UploadPane();
bankPane = new BankPane();
accountPane = new AccountPane();
reconcilationPane = new ReconcilationPane();
categoryPane = new CategoryPane();
tabbedPane = new JTabbedPane();
tabbedPane.addTab("Facture", uploadPane.getUploadScrollPane());
tabbedPane.addTab("Banque", bankPane.getBankScrollPane());
tabbedPane.addTab("Compte", accountPane.getAccountScrollPane());
tabbedPane.addTab("Reconcilation",reconcilationPane.getReconcilationScrollPane());
tabbedPane.addTab("Categorie", categoryPane.getCategoryScrollPane());
JPanel boutons = new JPanel();
boutonGet = new JButton("Get");
boutonAdd = new JButton("Ajouter");
boutonDel = new JButton("Supprimer");
boutonRefresh = new JButton();
boutonRefresh.setIcon(new ImageIcon(getClass().getResource("/org/libreapps/rest/rsc/img/refresh.png")));
boutons.add(boutonGet);
boutons.add(boutonAdd);
boutons.add(boutonDel);
boutons.add(boutonRefresh);
getContentPane().add(tabbedPane, BorderLayout.CENTER);
getContentPane().add(boutons, BorderLayout.SOUTH);
boutonGet.addActionListener(this);
boutonAdd.addActionListener(this);
boutonDel.addActionListener(this);
boutonRefresh.addActionListener(this);
} catch (Exception exc) {
exc.printStackTrace();
}
}
private void showOpenFileDialog() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Images", "jpg", "png", "gif", "bmp"));
fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("PDF Documents", "pdf"));
fileChooser.setAcceptAllFileFilterUsed(true);
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
uploadPane.getUploadTableModel().addLine(fileChooser.getSelectedFile());
}
}
