2016-01-21 3 views
1

Je n'arrive pas à comprendre pourquoi mon code ne fonctionne pas. En l'état, Eclipse ne me montre aucune erreur, mais le code ne sera pas lancé quand j'essayerai de l'exécuter.Problème avec le bloc-notes protégé par mot de passe en Java

L'idée de mon programme est un bloc-notes protégé par mot de passe utilisant JFrame.

Voici le code:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Scanner; 
import java.io.*; 

public class notepad extends JFrame implements ActionListener { 
    public static void main(String args[]){} 
    private TextArea textArea = new TextArea("", 0,0, TextArea.SCROLLBARS_VERTICAL_ONLY); 
    private MenuBar menuBar = new MenuBar(); 
    private Menu file = new Menu(); 
    private MenuItem openFile = new MenuItem(); 
    private MenuItem saveFile = new MenuItem(); 
    private MenuItem close = new MenuItem(); 
    public notepad() { 
     this.setSize(700, 500); 
     this.setTitle("Projet Java"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     this.textArea.setFont(new Font("Helvetica", Font.ROMAN_BASELINE, 12)); 
     this.getContentPane().setLayout(new BorderLayout()); 
     this.getContentPane().add(textArea); 
     this.setMenuBar(this.menuBar); 
     this.menuBar.add(this.file); 
     this.file.setLabel("File"); 
     this.openFile.setLabel("Open"); 
     this.openFile.addActionListener(this); 
     this.file.add(this.openFile); 
     this.saveFile.setLabel("Save"); 
     this.saveFile.addActionListener(this); 
     this.file.add(this.saveFile); 
    } 

    public void actionPerformed (ActionEvent e) { 
     if (e.getSource() == this.close) 
      this.dispose(); 
     else if (e.getSource() == this.openFile) { 
      JFileChooser open = new JFileChooser(); 
      int option = open.showOpenDialog(this); 
      if (option == JFileChooser.APPROVE_OPTION) { 
       this.textArea.setText(""); 
       try { 
        Scanner scan = new Scanner(new FileReader(open.getSelectedFile().getPath())); 
        while (scan.hasNext()) 
         this.textArea.append(scan.nextLine() + "\n"); 
       } catch (Exception ex) { 
        System.out.println(ex.getMessage()); 
       } 
      } 
     } 
     else if (e.getSource() == this.saveFile) { 
      JFileChooser save = new JFileChooser(); 
      int option = save.showSaveDialog(this); 
      if (option == JFileChooser.APPROVE_OPTION) { 
       try { 
        BufferedWriter out = new BufferedWriter(new FileWriter(save.getSelectedFile().getPath())); 
        out.write(this.textArea.getText()); 
        out.close(); 
       } catch (Exception ex) { 
        System.out.println(ex.getMessage()); 
       } 
      } 
     } 
    } 
     static class password{ 
     public static String password = "password"; 

     public static void main(String args[]) { 
       JFrame box = new JFrame("Password"); 
       box.setVisible(true); 
       box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       box.setSize(400,100); 

       JPasswordField pass = new JPasswordField(10); 
       pass.setEchoChar('*'); 
      } 
       static class AL implements ActionListener{ 
        public void actionPerformed(ActionEvent e){ 
        JPasswordField input = (JPasswordField) e.getSource(); 
        char[] pass = input.getPassword(); 
        String yes = new String(pass); 

        if (yes.equals(password)){ 
         notepad app = new notepad(); 
         app.setVisible(true); 
        }else{ 
         System.exit(0); 
        } 


        } 
       } 
     } 
} 
+0

Quand est-ce 'pass' sont ajoutés à quoi que ce soit? – MadProgrammer

+1

Vous avez également deux méthodes 'main', donc je n'ai aucune idée de celle que vous essayez d'appeler pour démarrer les choses. Vous mélangez également des composants lourds (AWT) avec des composants légers (Swing), cela ne s'arrêtera pas – MadProgrammer

+0

@MadProgrammer bien vu, je n'ai même pas vu cette première méthode 'main' et ça ne fait pas grand-chose : 'public void principal (String args []) {}' – null

Répondre

1
  • Votre première méthode principale est public, mais est vide si rien ne sera exécuté.
  • Vous avez votre deuxième méthode principale dans une classe non publique, donc la JVM ne la trouvera jamais pour démarrer votre programme.
  • Vous mélangez des composants graphiques AWT avec ceux de Swing, la règle est de choisir un type et de ne jamais mélanger les deux.
  • Toute votre application Swing doit être démarrée dans SwingUtilities.invokeLater pour vous assurer que tous les threads qui modifient l'interface graphique sont exécutés par le thread EDT (Event Dispatcher Thread).
  • Lorsque vous utilisez JTextArea, placez-le toujours à JScrollPane pour pouvoir accéder au texte affiché en dehors de la taille du composant.

VOICI code modifié pour le test:

import java.awt.Font; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileReader; 
import java.io.FileWriter; 

import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

@SuppressWarnings("serial") 
public class Notepad extends JFrame 
{ 
    public static void main(String args[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        UIManager.setLookAndFeel(
          "javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } 
       catch (ClassNotFoundException | InstantiationException 
         | IllegalAccessException 
         | UnsupportedLookAndFeelException e) 
       { 
        e.printStackTrace(); 
       } 
       new Notepad(); 
      } 
     }); 
    } 

    private JTextArea textArea = new JTextArea("", 0, 0); 
    private JMenuBar menuBar = new JMenuBar(); 
    private JMenu file = new JMenu(); 
    private JMenuItem openFile = new JMenuItem(); 
    private JMenuItem saveFile = new JMenuItem(); 
    private JMenuItem close = new JMenuItem(); 
    private JFileChooser open, save; 

    public Notepad() 
    { 
     setBounds(100, 100, 700, 500); 
     setTitle("Projet Java"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     textArea.setFont(new Font("Helvetica", Font.ROMAN_BASELINE, 12)); 
     add(new JScrollPane(textArea)); 

     open = new JFileChooser(); 
     save = new JFileChooser(); 

     setJMenuBar(menuBar); 
     menuBar.add(file); 
     file.setText("File"); 

     openFile.setText("Open"); 
     openFile.addActionListener(e -> { 
      if (open.showOpenDialog(
        Notepad.this) == JFileChooser.APPROVE_OPTION) 
      { 
       textArea.setText(""); 
       try (BufferedReader br = new BufferedReader(
         new FileReader(open.getSelectedFile()))) 
       { 
        String s = null; 
        while ((s = br.readLine()) != null) 
        { 
         textArea.append(s + "\n"); 
        } 
       } 
       catch (Exception ex) 
       { 
        System.out.println(ex.getMessage()); 
       } 
      } 
     }); 
     file.add(openFile); 

     saveFile.setText("Save"); 
     saveFile.addActionListener(e -> { 
      if (save.showSaveDialog(
        Notepad.this) == JFileChooser.APPROVE_OPTION) 
      { 
       try (BufferedWriter out = new BufferedWriter(
         new FileWriter(save.getSelectedFile()))) 
       { 
        out.write(textArea.getText()); 
       } 
       catch (Exception ex) 
       { 
        System.out.println(ex.getMessage()); 
       } 
      } 
     }); 
     file.add(saveFile); 

     close.setText("Close"); 
     close.addActionListener(e -> { 
      System.exit(0); 
     }); 
     file.add(close); 

     setVisible(true); 
    } 
} 
1

La raison est probablement que votre public static void main (String args []) est le mot de passe de la classe interne (statique), pas dans la classe de bloc-notes. D'abord, je ne sais pas si vous êtes un développeur Java expérimenté ou pas, mais il est généralement déconseillé de nommer des classes en utilisant des caractères minuscules (les classes sont généralement spécifiées au format suivant: MySuperCoolClass). Vous pouvez également envisager de ne pas le placer dans le package par défaut. Je voudrais également vous mettre en garde contre l'utilisation de classes statiques à moins d'y être obligé, et vous suggérer sérieusement d'utiliser des classes séparées pour chaque fenêtre - en utilisant des classes complètes. Je suggère également de créer la fenêtre principale à partir d'une classe de lanceur et de l'utiliser pour contrôler votre programme (ce dernier bit est juste mon expérience personnelle - je ne sais pas si c'est comme cela que d'autres développeurs Java le feraient). Avec cela à l'écart - vous devrez entrer dans votre configuration d'exécution et sélectionner le mot de passe $ mot de passe pour exécuter. Pour ce faire, en allant dans le menu Run-> Run Configurations, puis pour Main Class dans la zone de texte sous les mots "Main class:" il y a un bouton - recherche - à l'extrême gauche de la fenêtre, cliquez sur cela et sélectionnez le mot de passe $ mot de passe. Ou vous pouvez taper "mot de passe $ mot de passe" cela devrait fonctionner de toute façon.

Vous pouvez essayer ceci de votre ligne de commande ainsi - cd dans le répertoire bin de votre projet Eclipse et d'exécuter:

java notepad $ password

Maintenant, si je devais faire une suggestion, je suggère que vous ajoutez le code suivant (au minimum) à la méthode principale (String args []) -

public static void main(String args[]) { 
      JFrame box = new JFrame("Password"); 
      box.setVisible(true); 
      box.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      box.setSize(400,100); 

     JPasswordField pass = new JPasswordField(10); 
      //add action listener 
      pass.addActionListener(new AL()); 
      //add the pass to the box 
      box.add(pass); ; 
     } 

vous voulez probablement le ActionListener à ajouter à la boîte de mot de passe, depuis votre programme ne sera pas procéder sans. Votre programme d'écoute d'action se déclenchera lorsque la touche Entrée est activée dans la zone. Vous devez également ajouter votre passe à la boîte (votre JFrame).

Avec le code ci-dessus, et en modifiant votre configuration d'exécution - cela fonctionnera, bien qu'il pourrait utiliser un peu de travail (par exemple, vous voulez probablement fermer la boîte de dialogue de mot de passe après avoir affiché le bloc-notes).

Il existe d'autres améliorations, telles que la séparation du mot de passe en son propre fichier, et la création d'un lanceur plutôt que le lancement à partir de l'interface graphique, mais pour les tests de base.

Espérons que cela aide :)

Aleksei

+0

Merci, le code fonctionne comme je le veux maintenant! Et oui, je suis assez nouveau dans le développement Java, d'où la négligence générale de mon code. Mais cela m'a beaucoup aidé. – PWier