IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Optimisation du programme


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut Optimisation du programme
    Bonjour,

    Tout est dans le titre, je chercher à optimiser mon programme. J'ai déjà fais des recherches et je pense pas que ça soit possible. Le principe de mon programme est simple : j'ai un bouton qui lis les cellules d'un tableau Excel, puis j'ai un bouton qui permet de créer un fichier XML via les valeurs reçues précédemment. Toutes les données doivent s'afficher graphiquement.

    Voici donc mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            try {
                FileInputStream inputStream = new FileInputStream(new File("CHEMIN"));
                XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
                XSSFSheet sheet = workbook.getSheetAt(0);
                Iterator<Row> rowIterator = sheet.iterator();
                Row row = rowIterator.next();
                Row row1 = rowIterator.next();
                Row row2 = rowIterator.next();
                //Jusqu'à row64 car 64 lignes de données à récupérer...
     
                String param1 = (String) row.getCell(1).getStringCellValue();
                jLabel1.setText(param1);
                dtParam1 = param1;
     
                int nomComplet = (int) row.getCell(2).getNumericCellValue();
                eDT1 = Integer.toString(nomComplet);
                jTextField1.setText(eDT1);
     
                String param2 = (String) row1.getCell(1).getStringCellValue();
                jLabel2.setText(param2);
                dtParam2 = param2;
     
                int nomComplet1 = (int) row1.getCell(2).getNumericCellValue();
                eDT1 = Integer.toString(nomComplet1);
                jTextField2.setText(eDT1);
     
                String param3 = (String) row2.getCell(1).getStringCellValue();
                jLabel3.setText(param3);
                dtParam3 = param3;
     
                int nomComplet2 = (int) row2.getCell(2).getNumericCellValue();
                eDT2 = Integer.toString(nomComplet2);
                jTextField3.setText(eDT2);
     
               //Tout ça pour 64 données, avec deux valeurs par ligne à chaque fois dont une en int et une en String
     
            } catch (FileNotFoundException ex) {
                Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }                                        
     
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
            try {
                DocumentBuilder builder = factory.newDocumentBuilder();
     
                Document xml = builder.newDocument(); //Création du fichier
                Element root = xml.createElement("conf"); //Création de notre élément racine  
     
                Element param = xml.createElement("param");
                Element param1 = xml.createElement("param");
                Element param2 = xml.createElement("param");
                //jusqu'à Element param64
     
                root.appendChild(param);
                root.appendChild(param1);
                root.appendChild(param2);
                //jusqu'à root.appendChild(param64);
     
                dt1 = jTextField1.getText();
                dt2 = jTextField2.getText();
                //jusqu'à dt64
     
                param.setAttribute("id", "0");
                param.setAttribute("name", dtParam1);
                param.setAttribute("value", dt1);
     
                param1.setAttribute("id", "1");
                param1.setAttribute("name", dtParam2);
                param1.setAttribute("value", dt2);
     
                //Jusqu'à param64
     
                Transformer t = TransformerFactory.newInstance().newTransformer();
                t.setOutputProperty(OutputKeys.INDENT, "yes");
                t.setOutputProperty(OutputKeys.VERSION, "1.0");
                // appliquer la transformation
                String resultFile = "test.conf";
                StreamResult XML = new StreamResult(resultFile);
     
                t.transform(new DOMSource(root), XML);
            } catch (DOMException | ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException abc) {
            }
        }
    Mon programme est donc simple à comprendre, à effectuée, mais très long et très lourd. Si vous l'avez pas compris, j'ai 64 valeurs à récupérer et ces 64 valeurs sont aussi attribuées à 64 noms. Pour le premier bouton, il y a donc 128 données à récupérer (64 en int, 64 en String), puis ces 128 données seront dans l'interface graphique : 64 données à mettre dans un label, et 64 autres à mettre dans un fieldtext. Puis pour finir, ces valeurs seront attribuées à des variables pour les réutiliser dans le bouton 2.

    Pour le deuxième bouton, je récupère la valeur lue dans le TextField vu qu'il peut y avoir une modification, et je créer mon fichier XML. Ceci est très fastudieux et je pense que je peux faire ceci beaucoup plus simplement avec une boucle for ou while (au moins pour le fichier Excel) mais je ne trouve pas.

    Merci de votre aide.

  2. #2
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut

    Ton code est optimisable (en terme de lecture/compréhension/temp d'écriture) en utilisant des tableaux ou des listes au lieu de plusieurs variables.
    (Je ne suis pas sûr que ça optimise en terme de temps d'exécution ou d'empreinte mémoire)

    Au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Row row1 = ...;
    Row row2 = ...;
    Row row3 = ...;
    //etc 64 fois
    Tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<Row> rows = new ArrayList<Row>(64);
    for(int i=0; i<rows.size(); i++) {
        /!\ rows[i] = ...; //La syntaxe n'est pas bonne ici
        rows.set(i, ... ); //C'est mieux
    }
    EDIT : Attention, il y avait une erreur de syntaxe

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Row> rows = new ArrayList<Row>(64);
    for (int i = 0; i < rows.size(); i++) {
    rows.set(i, rowIterator.next());
    }
    Mais sauf que après lorsque je veux lire mon tableau, je dis :
    x = à telle cellule de telle ligne
    x1 = à telle cellule de telle ligne

    Sauf que si je fais ta méthode, je n'ai plus de variable qui différencie row x de row y

    En gros ta méthode marche, mais après je ne peux pas lire mes cellules car mes variables row1, row2, etc ne sont plus connues.

    Chaque cellule est attribué à une variable que j'écris ensuite, donc en fait il faudrait une boucle qui change la ligne automatiquement, mais aussi la variable et le jLabel (tout le temps +1) mais ceci est impossible je pense.

  4. #4
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    J'ai modifié mon message précédent car il y avait une erreur de syntaxe


    Je n'ai pas bien compris ce qui te pose problème...

    Si c'est de pouvoir accéder au valeur de la liste, il faut utiliser la méthode get()
    Donc pour accéder à tes valeurs tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rows.get(0) //équivalent de row
    rows.get(1) //équivalent de row1
    rows.get(2) //équivalent de row2
    Par exemple pour gérer tes Jlabel et JTextField :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    List<JLabel> jLabels;
    List<JTextField> jTextFields;
    //Il faut que tu initialises tes listes, là je l'ai pas fait pour montrer surtout la suite
     
    for(int i=0; i<rows.size(); i++) {
        String param = (String) rows.get(i).getCell(1).getStringCellValue();
        jLabels.get(i).setText(param);
     
        int nomComplet = (int) rows.get(i).getCell(2).getNumericCellValue();
        jTextFields.get(i).setText(Integer.toString(nomComplet);)
    }

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je ne connaissais pas la méthode get(), merci !

    Du coup, j'obtiens ceci comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List<JLabel> jLabels = null;
    List<JTextField> jTextFields = null;
    List<Row> rows = new ArrayList<>(64);
     
    //Il faut que tu initialises tes listes, là je l'ai pas fait pour montrer surtout la suite
    for (int i = 0; i < rows.size(); i++) {
    rows.set(i, rowIterator.next());
     
    String param = (String) rows.get(i).getCell(1).getStringCellValue();
    jLabels.get(i).setText(param);
     
    int nomComplet = (int) rows.get(i).getCell(2).getNumericCellValue();
    jTextFields.get(i).setText(Integer.toString(nomComplet));
    }
    Je commence à comprendre l'intérêt de ce morceau de programme et je pense qu'il fait parfaitement ce que je veux faire.
    Cependant, lorsque je lance mon programme et que j'appuie sur mon bouton, aucun Label et aucun TextField se remplis.

    Je pense que mon soucis vient du fait que j'initialise mes listes de jLabel et de TextField à null.

  6. #6
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    Citation Envoyé par tomlrt53 Voir le message
    Cependant, lorsque je lance mon programme et que j'appuie sur mon bouton, aucun Label et aucun TextField se remplis.
    Je pense que mon soucis vient du fait que j'initialise mes listes de jLabel et de TextField à null.
    Exactement ! Tu commences à bien comprendre ce que tu fais c'est cool

    Dans ton code, il faut d'abord que tu crée (ou récupère) tes instances de JLabel avant de pouvoir définir leur texte.
    C'est à dire il faut faire quelque chose comme jLabels.add(new JLabel()); avant de pouvoir faire jLabels.get(i).setText("blabla");. Sinon tu appelle la méthode setText() sur un objet null et ton programme doit planter (en retournant une NullPointerException).

    Ici je ne sais pas comment on initialise un JLabel (c'est un truc que j'ai encore jamais manipuler). Donc faire new JLabel() est peut-être pas la bonne méthode.
    Dans ton code précédent, comment étaient initialisé les JLabel ?

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je travaille avec Netbeans, donc mes jLabel sont initialisés automatiquement, moi j'écris juste dedans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jLabel64 = new javax.swing.JLabel();
    est la ligne que j'obtiens dans le code générer par Netbeans, juste après celle-ci
    j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jLabel64 = setText("");

    Donc je devrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jLabels.add(new javax.swing.JLabel();

  8. #8
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    Je suis allez voir la documentation du JLabel, et effectivement c'est ce qu'il faut faire.

    Tu peux même optimiser encore plus en définissant le texte lors de la construction du JLabel en utilisant le constructeur JLabel(String text) : jlabels.add(new JLabel(param));

    Note : Lors de la déclaration des listes, on a fait deux choses différentes jusque là.

    Pour la liste rows, on a déclarer que c'était une liste de Row avec une taille initiale de 64 mais sans initialiser ces éléments. : List<Row> rows = new ArrayList<Row>(64);Puis on initialise les éléments en définissant quels objet va à quel place : rows.set(i, rowIterator.next());. i est l'index où on mets l'objet, et Iterator.next() nous donne l'objet qu'on met à cette place.

    Dans le deuxième cas on a déclarer la liste jLabels sans définir quoi que ce soit ni l'initialiser : List<JLabel> jLabels; (En fait quand on initialise pas un objet, Java initialise automatiquement à null).
    Ensuite il faut l'initialiser en définissant que c'est une jLabels = ArrayList<>();, ici on n'a pas défini de taille, c'est donc une liste vide, on ne peut pas définir quel object va à quelle place puisqu'il n'y a pas de place défini. Il faut donc ajouter les éléments, plutôt que les placer : jlabels.add(new JLabel());

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Donc je récapitule avec tous ce que j'ai compris :

    1. Je dois enlever tous les jLabel de mon interface graphique
    2. Je dois créer mes jLabel avec ce que nous avons vu plutôt
    3. Je dois les placer avec mes coordonnées voulues
    4. Puis je dois les compléter avec mon tableau.


    Si c'est ça, autant laisser comme c'est car je me vois pas faire les coordonnées de tous les éléments..
    Le but de l'optimisation était de pouvoir lire facilement. Mais si je dois créer 64 jLabel, 64 lignes de coordonnées, une boucle for, alors ce n'est plus du tout optimal et facile à lire

    Qu'en penses tu ?
    Merci vraiment pour tes réponses rapide !

  10. #10
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    J'avais pas compris que tu faisait ça à partir d'une interface graphique qui te définit "toute seule" tes JLabel.
    Effectivement si tu dois tout réécrire (initialisation, position, etc) c'est plus long.

    Tu peux faire un mix, en créant tes JLabel à partir de ton interface graphique. Comme ça tu ne redéfini pas toutes tes positions.
    Puis tu crées ta liste et ajoute tout les JLabel créés par ton interface dans la liste, comme ça par la suite tu peux manipuler un truc plus pratique (une liste) que 64 variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Passage un peu moche mais nécéssaire pour que la suite soit propre
    List<JLabel> jLabels = new ArrayList<>();
    jLabels.add(jLabel0);
    jLabels.add(jLabel1);
    jLabels.add(jLabel2);
    ...
     
    //A partir de maintenant on peut manipuler la liste

  11. #11
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    (J'ai modifié mon explication sur l'initialisation des listes car elle était imprécise )

    Citation Envoyé par tomlrt53 Voir le message
    Qu'en penses tu ?
    Il y a peut-être une astuce/méthode pour initialiser plusieurs JLabel à des positions précises, ou bien dire à l'interface graphique de créer une liste plutôt que plusieurs variables. Mais là il va falloir consulter quelqu'un qui s'y connait (Je ne connais ni NetBeans, ni swing). Le mieux est pour ça est de recréer une question spécifique à ce problème

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je vais d'abord faire la dernière proposition et ensuite je vais me renseigner sur les autres possibilités plus spécifiques !
    Merci beaucoup de ton aide !

    J'ai un autre problème sur ce même programme, si tu jeter un oeil à celui ci (ça concerne Java et XML) :
    https://www.developpez.net/forums/d1...d-fichier-xml/ !

    Merci !

Discussions similaires

  1. Optimiser un programme VB
    Par Eausport dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 05/06/2009, 15h56
  2. [Macro] optimisation de programmes SAS
    Par bar_79 dans le forum Macro
    Réponses: 4
    Dernier message: 25/11/2008, 15h51
  3. Optimiser des programmes .net
    Par TSalm dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 06/03/2008, 12h19
  4. Optimiser un programme java
    Par piteon dans le forum Général Java
    Réponses: 27
    Dernier message: 05/08/2007, 20h01
  5. Réponses: 9
    Dernier message: 07/11/2006, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo