OpenPlane

a marqué ce sujet comme résolu.

Je continu tranquillement le projet.
Je l'ai repensé entièrement afin d'adopter une architecture MVC, ce qui rend le code beaucoup plus simple à maintenir. En revanche, je le trouve plus compliqué à comprendre. En effet, je me retrouve à passer les attributs de mes classes à travers des getters. Du coup, faut réussir à suivre où en est l'attribut ! :-°

J'en suis actuellement à implémenter le Logbook qui sera la fenêtre principale du programme :

Le logbook d'OpenPlane

Comme vous pouvez le voir, c'est un peu vide. En effet, je me limite pour le moment à deux attributs pour la classe Plane et six attributs pour la classe Log (ceux que vous voyez dans le tableau). Une fois que tout fonctionnera parfaitement avec ces arguments, j'implémente les nested tableView :

Source: Stackoverflow

Je pourrais ainsi avoir, comme dans les vrais carnets de vol, une colonne Avion avec en sous colonnes Immatriculation et Type. De même avec les temps de vol (temps de vol de jour, de nuit, total) etc. Puis j'ajouterais tous les attributs importants. Donc ça devrait pas mal se remplir.

Voilou, bonne journée. :)

EDIT: Gros oubli ! Avant, les avions étaient enregistrés au format JSON, tous dans un fichier indépendant. Désormais, voici le fichier… planes.xml :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<planes>
    <plane>
        <created>2016-02-21</created>
        <registration>F-SAEZ</registration>
        <type>DR400</type>
    </plane>
    <plane>
        <created>2015-02-21</created>
        <registration>F-FBZH</registration>
        <type>DR400-120</type>
    </plane>
</planes>

Pour plus de détails :

En fait, la raison de se virement est toute simple. Java intègre directement tout ce qu'il faut pour gérer le XML de façon très propre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package com.louis.plane_manager.model;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement(name = "planes")
public class PlaneListWrapper {
   private List<Plane> planes;

   @XmlElement(name = "plane")
   public List<Plane> getPlanes() {
       return planes;
   }

   public void setPlanes(List<Plane> planes) {
       this.planes = planes;
   }
}

Plus qu'à utiliser la classe :

1
2
3
4
5
6
7
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

PlaneListWrapper wrapper = new PlaneListWrapper();
wrapper.setPlanes(planeData);

m.marshal(wrapper, file);

Et voilà, c'est finit! Donc pourquoi m'embêter avec du JSON quand le XML est aussi bien géré dans Java ? :D

+0 -0

Je comprendrai jamais cette réputation que les gens donnent au Java ^^' et des accès contrôlés (Java -> getters et setters) c'est la base en programmation orienté objet, pour le coup c'est python qui est une hérésie en laissant tout "en public" :P

En tous cas chapeau bas pour ton projet!

Ce que je reproche à Java, ce n'est pas les accesseurs, ça j'en ai l'habitude avec Ruby (oui parce que je fais plus de Ruby que de Python) ou encore avec le C++. En faite, ce sont surtout ses erreurs, qui, selon moi, sont illisibles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
   at com.louis.logbook.view.LogOverviewController.lambda$setLogbook$6(LogOverviewController.java:54)
   at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:182)
   at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
   at javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
   at javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
   at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112)
   at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146)
   at javafx.scene.control.SelectionModel.setSelectedItem(SelectionModel.java:102)
   at javafx.scene.control.MultipleSelectionModelBase.lambda$new$34(MultipleSelectionModelBase.java:67)
   at com.sun.javafx.binding.ExpressionHelper$SingleInvalidation.fireValueChangedEvent(ExpressionHelper.java:137)
   at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
   at javafx.beans.property.ReadOnlyIntegerPropertyBase.fireValueChangedEvent(ReadOnlyIntegerPropertyBase.java:72)
   at javafx.beans.property.ReadOnlyIntegerWrapper.fireValueChangedEvent(ReadOnlyIntegerWrapper.java:102)
   at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:113)
   at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:147)
   at javafx.scene.control.SelectionModel.setSelectedIndex(SelectionModel.java:68)
   at javafx.scene.control.TableView$TableViewArrayListSelectionModel.updateSelectedIndex(TableView.java:2945)
   at javafx.scene.control.TableView$TableViewArrayListSelectionModel.select(TableView.java:2458)
   at javafx.scene.control.TableView$TableViewArrayListSelectionModel.clearAndSelect(TableView.java:2388)
   at javafx.scene.control.TableView$TableViewSelectionModel.clearAndSelect(TableView.java:1914)
   at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.simpleSelect(TableCellBehaviorBase.java:215)
   at com.sun.javafx.scene.control.behavior.TableCellBehaviorBase.doSelect(TableCellBehaviorBase.java:148)
   at com.sun.javafx.scene.control.behavior.CellBehaviorBase.mousePressed(CellBehaviorBase.java:150)
   at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:95)
   at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
   at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
   at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
   at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
   at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
   at javafx.event.Event.fireEvent(Event.java:198)
   at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
   at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
   at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
   at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
   at java.security.AccessController.doPrivileged(Native Method)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)
   at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
   at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
   at com.sun.glass.ui.View.notifyMouse(View.java:937)
   at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
   at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139)
   at java.lang.Thread.run(Thread.java:745)

Pour celle-ci je sais d'où vient l'erreur, je l'ai provoqué. Mais franchement.. Au lieu d'un NullPointerException, j'aurais préféré avoir un LogEditorControllerNotFound ce qui aurait été beaucoup plus clair…

Pour les getters, setters, c'est pas eux le problème. C'est mon architecture. Je me suis basé sur du MVC, du coup, chaque controller se retrouve avec un attribut qui représente la fenêtre dans laquelle le widget qu'ils contrôlent se trouve. Et comme ils ont accès à cette fenêtre, parfois.. Bah ils la modifie et c'est là qu'il faut savoir où en est la fenêtre pour comprendre les modifications. ;)

Ce n'est pas la faute à Java directement, mais au dev de JavaFX pour l'erreur selon moi (Oui je sais que JavaFX est développer par Java, mais passons).

Et tu verras, ça fais maintenant ~5-6 mois que j'utilise JavaFX on commence à s'y habituer à ces message de *.

Je comprendrai jamais cette réputation que les gens donnent au Java ^^' et des accès contrôlés (Java -> getters et setters) c'est la base en programmation orienté objet, pour le coup c'est python qui est une hérésie en laissant tout "en public" :P

Genroa

J'en sais tellement peu sur le Java que je ne vais pas critiquer. Je ne saurais même pas afficher un Hello World. C'est pour ça que ça m'apparait comme du chinois, pas du fait du language lui même mais de mon manque de connaissance à son sujet. (Et puis pour avoir été choisi pour Android, il doit quand même avoir pas mal d'avantages je suppose)

+0 -0

Je comprendrai jamais cette réputation que les gens donnent au Java ^^' et des accès contrôlés (Java -> getters et setters) c'est la base en programmation orienté objet, pour le coup c'est python qui est une hérésie en laissant tout "en public" :P

J'en sais tellement peu sur le Java que je ne vais pas critiquer. Je ne saurais même pas afficher un Hello World. C'est pour ça que ça m'apparait comme du chinois, pas du fait du language lui même mais de mon manque de connaissance à son sujet. (Et puis pour avoir été choisi pour Android, il doit quand même avoir pas mal d'avantages je suppose)

Au départ, comme beaucoup de monde, j'avais une image très négative du Java. Comme j'ai souvent pu le voir, ce qui est le plus reproché à Java, c'est qu'il tourne sur une JVM. (Et donc qu'il a des performances moindre. Mais ce n'est pas visible pour des projets d'une ampleur normal).

Quand on regarde dans le fond (Corrigé moi si je dis des bêtises), je crois que le C# tourne aussi sur une VM (.NET).

Et le faites peut-être aussi que Java ne fonctionne qu'avec des objets. (Ce que je ne trouve de loin pas dérangeant) et également le faites que nous ne pouvons pas faire d'héritage multiple comme en C++ (Mais que l'on peut assez bien camoufler avec les Interfaces).

[edit]
Sinon on va peut-être gentiment stop le débat ici, on pollue un peu son Topic la..

+0 -0

Et voilà, c'est finit! Donc pourquoi m'embêter avec du JSON quand le XML est aussi bien géré dans Java ? :D

Sa aurait pu être bien si tu souhaites un jour continuer le support web (Django) pour avoir une interface Web (Si imaginons que tu trouves par exemple un support lucratif pour payer un hébergement). Rien n'empêche après de faire une fonction d'export <-> Import format XML <-> JSON.

(Mais je suis d'accord qu'en l'état, utiliser du XML est plus simple, car on ne peut pas traiter le JSON sans passer par une librairie externe).

Python gère parfaitement le XML également je pense ! Du coup, même si je trouve le JSON plus propre, je pense que je vais passer sur du full XML pour stocker les données utilisateurs comme les avions, les profils, les licences… Par contre pour les logs, je pense passer par une base de donnée. Bonne idée ou pas d'après vous ?

Ça peut être pas mal d'utiliser du SQLite par exemple pour les logs si tu veux permettre à tes utilisateurs de requêter la BDD, par exemple pour faire une liste des vols de plus de tant de temps faits avec tel avion. Ça apporterait plus de flexibilité dans les améliorations futures, non ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte