Programmation d'un éditeur de texte

Programmation d'un éditeur de texte - Java - Programmation

Marsh Posté le 14-10-2013 à 12:16:28    

Bonjour,
 
Je suis étudiant en informatique, et nous avons pour projet de programmer un éditeur de texte soi-même.  
Jusqu'à présent, j'ai réussi à ouvrir un éditeur à peu près correct. La prochaine étape, c'est d'ajouter un "*" à la fin du nom du texte lorsque celui-ci est modifié.
Et c'est là que deux problèmes se posent : D'une part, le texte d'origine du départ est le seul à accepter les modifications (normalement, si j'écris sur un texte ou si j'en supprime une partie, il est censé écrire "insertion" ou "suppression" dans le terminal). Quand j'ouvre un autre texte, celui-ci ne prend même pas en compte les modifications.
 
Le deuxième problème, je ne le comprend pas : J'ai un NullPointerException au tout début de l'exécution du programme. Mais étrangement, ça ne lui fait rien, il marche quand même. Il peut ouvrir les textes situés dans le même répertoire. En revanche, si le fichier est situé dans un autre répertoire, il me répond "lireFichierDuDisque:PB Fichierjava.io.FileNotFoundException: readme.txt (No such file or directory)"
 
 
Voilà... Je tourne en rond depuis hier soir sans trouver la faute. Donc, si jamais l'un de vous peut me la signaler, ce serait génial.  
Je vous transmets le code source :
 
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import javax.swing.event.*;
  5. import java.io.BufferedReader;
  6. import java.io.BufferedWriter;
  7. import java.io.File;
  8. import java.io.FileFilter;
  9. import java.io.FileReader;
  10. import java.io.FileWriter;
  11. import javax.swing.filechooser.FileNameExtensionFilter;
  12. import javax.swing.text.BadLocationException;
  13. import javax.swing.text.PlainDocument;
  14. public class Version1 extends JFrame implements ActionListener//, ItemListener
  15. {
  16. private JMenuItem item1MenuFichier;
  17. private JMenuItem item2MenuFichier;
  18. private JMenuItem item3MenuFichier;
  19.  
  20. private JTextArea jtArea;
  21.  
  22. private String texte;
  23.  
  24.    private boolean modifie=false;
  25. public Version1()
  26. {
  27.  setTitle("Version1" );
  28.  setLocation(50, 50);
  29.  setSize(300, 400);
  30.  // l'ensemble du menu
  31.  JMenuBar menuBar = new JMenuBar();
  32.  // un element de la barre de menu
  33.  JMenu menuFichier = new JMenu("Fichier" );
  34.      
  35.  // les items du menu fichier
  36.  item1MenuFichier = new JMenuItem("Enregistrer" );
  37.  item1MenuFichier.addActionListener(this);
  38.  item2MenuFichier = new JMenuItem("Ouvrir" );
  39.  item2MenuFichier.addActionListener(this);
  40.  item3MenuFichier = new JMenuItem("Quitter" );
  41.  item3MenuFichier.addActionListener(this);
  42.      
  43.  // ajouts des items au menu correspondant
  44.  menuFichier.add(item1MenuFichier);
  45.  menuFichier.addSeparator();
  46.  menuFichier.add(item2MenuFichier);
  47.      
  48.  menuFichier.add(item3MenuFichier);
  49.  // ajout du menu 'Fichier' a la barre de menu
  50.  menuBar.add(menuFichier);
  51.  // lien du menu a la Frame
  52.  setJMenuBar(menuBar);
  53.      
  54.  // abonnement aux evenements de gestion de la fenetre
  55.  addWindowListener(new WindowAdapter()
  56.  {
  57.   public void windowClosing(WindowEvent evt)
  58.   {
  59.    System.exit(0);
  60.   }
  61.  } );
  62.      
  63.       // creation du document texte
  64.       PlainDocument document = new PlainDocument();
  65.        
  66.       String strTest = "Bonjour à tous !";
  67.        
  68.       // ajout d'un contenu
  69.       try
  70.       {
  71.          document.insertString(0, strTest, null);
  72.       } catch (BadLocationException e)
  73.       {
  74.          e.printStackTrace();
  75.       }
  76.        
  77.       // creation d'IHM texte
  78.       jtArea = new JTextArea(document);
  79.        
  80.       // le parametrage de JTextArea n'est pas obligatoire
  81.       /*
  82.          
  83.       // on coupe les lignes  
  84.       jtArea.setLineWrap(true);
  85.          
  86.       // les lignes sont coupees apres les mots
  87.       jtArea.setWrapStyleWord(true);
  88.                  
  89.       // choix de la police utilisee pour TOUT le document
  90.       jtArea.setFont(new Font(Font.MONOSPACED, Font.ITALIC, 24));
  91.       */
  92.        
  93.       // ajout de l'ascenseur (si le texte est trop long)
  94.       JScrollPane scrollPane = new JScrollPane(jtArea);     
  95.       add(scrollPane);
  96.       jtArea.getDocument().addDocumentListener(new MyDocumentListener());
  97.       lireFichierDuDisque(texte);
  98.       ecrireFichierSurDisque(texte);     
  99.  setVisible(true);
  100. }
  101. class MyDocumentListener implements DocumentListener
  102. {
  103.   
  104.  public void changedUpdate(DocumentEvent e)
  105.  {
  106.     
  107.  }
  108.  public void insertUpdate(DocumentEvent e)
  109.  {
  110.   System.out.println("Insertion de texte" );
  111.          modifie=true;
  112.  }
  113.  public void removeUpdate(DocumentEvent e)
  114.  {
  115.   System.out.println("Suppression de texte" );
  116.          modifie=true;
  117.  }
  118.    
  119. }
  120. public void actionPerformed(ActionEvent e)
  121. {
  122.      
  123.  if(e.getSource()==item1MenuFichier)
  124.  {
  125.   System.out.println("Enregistre" );
  126.  }
  127.       if(e.getSource()==item2MenuFichier)
  128.  {
  129.   JFileChooser chooser = new JFileChooser();
  130.   FileNameExtensionFilter filter = new FileNameExtensionFilter("fichier","txt", "java" );
  131.   chooser.setFileFilter(filter);
  132.        
  133.   chooser.setApproveButtonText("Choix du fichier..." ); //intitule du bouton
  134.   //chooser.showOpenDialog(null); //affiche la boite de dialogue
  135.   if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
  136.   {
  137.    //jtArea.setText(chooser.getSelectedFile().getAbsolutePath());  
  138.             String nom=chooser.getSelectedFile().getName();
  139.             String chemin=chooser.getSelectedFile().getAbsolutePath();
  140.                setTitle(nom);
  141.             System.out.println(nom);
  142.             System.out.println(chemin);
  143.             lireFichierDuDisque(chooser.getSelectedFile().getName());
  144.                if(modifie==true)
  145.                {
  146.                   setTitle(nom+"*" );
  147.                }
  148.            
  149.             //si un fichier est selectionné, récupérer le fichier puis son path et l'afficher dans le champs de texte
  150.   }
  151.   else
  152.          {
  153.             System.out.println("Annuler" );
  154.          }
  155.  }
  156.  if(e.getSource()==item3MenuFichier)
  157.  {
  158.   System.out.println("Quitter" );
  159.   System.exit(0);
  160.  }
  161. }
  162.  
  163.    private void lireFichierDuDisque(String nomFichier)
  164.    {
  165.       try
  166.       {
  167.          // ouvrir le fichier
  168.          BufferedReader bf= new BufferedReader(new FileReader(nomFichier));
  169.          jtArea.read(bf,jtArea);
  170.          bf.close();
  171.       }
  172.       catch(Exception e)
  173.       {
  174.          System.out.println("lireFichierDuDisque:PB Fichier" + e);
  175.       }
  176.    }
  177.    private void ecrireFichierSurDisque(String nomFichier)
  178.    {
  179.       try
  180.       {
  181.          BufferedWriter bw = new BufferedWriter(new FileWriter(nomFichier));
  182.          jtArea.write(bw);
  183.          bw.close();
  184.       }
  185.       catch(Exception e)
  186.       {
  187.           System.out.println("ecrireFichierSurDisque:PB Fichier" + e);
  188.       }
  189.    }
  190. public static void main(String [] arg)
  191. {
  192.  new Version1();
  193. }
  194. }


 
 
Merci d'avance ! ^^  

Reply

Marsh Posté le 14-10-2013 à 12:16:28   

Reply

Marsh Posté le 15-10-2013 à 01:00:49    

Le null pointer vient de  

Code :
  1. lireFichierDuDisque(texte);
  2.    ecrireFichierSurDisque(texte);


 
La variable texte n'est pas "setté" à ce moment là
 
Pour le coup du répertoire courant, c'est normal, tu n'ouvres pas le fichier avec le chemin complet, mais juste son nom. La vrai question est :
- pourquoi ne passe tu pas en paramètre à la fonction lireFichierDuDisque ou ecrireFichierDuDisque un "File" (java.io.File) plutôt que son nom.
 
D'ailleurs le "File" courant pourrait être une variable de ta classe pour permettre la sauvegarde si il a été modifié. et la variable "modifie" devrait être remise à "false" après une ouverture de fichier...
 
Bref, il faudrait revoir un peu la structure... ça manque de spécifications tout ça (de conception quoi)...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed