2017-02-01 2 views
-1

J'essaie de créer un programme de lancement d'application pour mon projet de classe. J'essaye d'implémenter une fonction qui prendra chaque ligne d'un fichier texte et la mettra à JLabel et ajouterai ActionListener chaque fois que la boucle court. À la fin de la boucle, il affichait tous les JLabels, mais chaque fois que je cliquais sur l'un d'entre eux, il ouvrait le dernier programme qui existait dans un fichier.Créer une nouvelle instance de JLabel et actionlistener dans la boucle

Ma question est comment puis-je arriver à l'endroit où je peux cliquer sur un nom de programme et ouvrir le bon fichier?

Voici le code que je l'ai fait:

public static void list() 
{ 
    String file = "files/programList.txt"; 

    //final Scanner read = new Scanner(file); 
    String filePath; 
    String content; 
    String line = ""; 
    content = "<html>"; 
    int count = 0, i = 0, y = 0; 
    int x = 0; 
    lines = 0; 
    try 
    { 
     FileReader read = new FileReader(file); 
     LineNumberReader lRead = new LineNumberReader(
          new FileReader(new File("files/programList.txt"))); 
     lRead.skip(Long.MAX_VALUE); 
     BufferedReader bRead = new BufferedReader(read); 
     int numbOfLines = lRead.getLineNumber() + 1; 
     System.out.println(numbOfLines); 
     fixedLine = new ArrayList<String>(lRead.getLineNumber()); 
     while((line = bRead.readLine()) != null) 
     { 
      int index = -1; 

      if(lines != numbOfLines) 
      { 
       if(lines == 0) 
       { 
        fixedLine.add(line); 
        lines = 1; 
       } 
       else 
       { 
        fixedLine.set(lines++, line); 
        //fixedLine = line; 
        //pLine = new JLabel(fixedLine); 
        //pLine.setFont(new Font("Verdana", 1, 20)); 
        //pLine.setForeground(Color.WHITE); 
        //pLine.addMouseListener(new MouseAdapter() 
        //{ 
        // public void mouseClicked(MouseEvent e) 
        //{ 
        // fileList.run(pLine.getText()); 
        // System.out.println(pLine.getText()); 
        //} 
        //}); 
        //panel.add(pLine); 
        //frame.repaint(); 
        //frame.revalidate(); 
        content = content + line + "<br>"; 
        System.out.println(lines); 

        System.out.println(fixedLine); 
       } 
      } 
      else 
      { 
       lines++; 
      } 
     } 
     bRead.close(); 
     lRead.close(); 
     content = content + "</html>"; 
     System.out.println(fixedLine.get(0)); 

     System.out.println(numbOfLines);//maybe use array or arraylist 
    } 
    catch(IOException e) 
    { 
     System.err.println(e.getMessage()); 
    } 

} 

J'expérimentait une arraylist chaîne et seulement ai obtenu ajouter un programme avant qu'il me donne une erreur.

Que puis-je faire pour que cela fonctionne?

Après je reçois le programme que je vais travailler simplifier mon code et améliorer comme je sais que mon codage est pas le meilleur

+1

'avant qu'il me donne un error', si vous voulez que les gens aident avec l'erreur que vous obtenez, montrez-leur l'erreur que vous obtenez – SomeJavaGuy

+0

ne pas vraiment comprendre ce que vous essayez, mais remplacez d'abord le fixedLine.set (..) avec fixedLine.add (..) pour éviter une erreur ArrayIndexOutOfBoundsException – clic

+0

@clic J'ai déjà essayé cela auparavant et je mettrais toujours juste la dernière ligne du fichier texte dans le tableau. J'ai essayé de placer le fixedLine.add() avant la boucle while afin qu'il y ait quelque chose dans le tableau alors que dans la boucle, et comme vu dans le code essayé une instruction if. Je n'ai pas travaillé avec beaucoup de tableaux avant – feare56

Répondre

0

Vous voulez exécuter quelque chose lorsque vous cliquez sur un JLabel, quelque chose lire un fichier. Je pense que vous faites des choses étranges pour lire les lignes. Pourquoi tant de listes? Vous pouvez faire quelque chose comme

Files.lines(Paths.get("files", "programList.txt")).forEach(
      f -> { 
       JLabel label = new JLabel(f); 
       label.addMouseListener(new MouseAdapter() { 
        public void mouseClicked(MouseEvent e) { 
         executeopeningMagicWithTheFile(f); 
        } 
       }); 
       panel.add(label); 
      } 
    ); 

J'espère que cette aide, il est assez clair exactement ce que vous voulez depuis votre code contient du code dans le commentaire et les variables qui ne sont pas définies

+0

Est-ce que cela remplacerait tout dans l'instruction try? Désolé pour tous les commentaires, j'étais en train d'implémenter ArrayList et j'ai commenté tout le code que je connaissais en partie pour que je puisse revenir à l'ancienne si nécessaire. – feare56

+0

Oui, il remplacerait cela. – Redlab