2017-02-01 72 views
-1

我正在嘗試爲我的類項目創建一個應用程序啓動器。在循環中創建JLabel和actionlistener的新實例

我想實現一個函數,它將從文本文件中取出每一行,並將其放入JLabel,並在每次循環運行時添加一個ActionListener。在循環結束時,它確實顯示了所有的JLabels,但是每當我點擊任何它會打開文件中最後一個程序。

我的問題是我該如何做到我可以點擊程序名並打開正確的文件?

這裏是我做的代碼:

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()); 
    } 

} 

我與一個字符串數組列表試驗和只得到它來添加一個程序它給了我一個錯誤之前。

我能做些什麼才能使它工作?

後,我得到的程序工作,我將簡化我的代碼和改進它,因爲我知道我的編碼是不是最好的

+1

'之前它給了我一個error',如果你希望人們幫助你得到的錯誤,向他們展示你得到的錯誤 – SomeJavaGuy

+0

並不真正瞭解你正在嘗試的,但首先用fixedLine.add(..)替換fixedLine.set(..)。 )來避免ArrayIndexOutOfBoundsException – clic

+0

@clic我已經嘗試過,它總是會把文本文件的最後一行放在數組中。我試過在while循環之前放置fixedLine.add(),所以在循環中會有數組中的東西,並且在代碼中看到了if語句。在 – feare56

回答

0

所以要執行,當你點擊一個JLabel,東西從文件中讀取的東西。我認爲你會做一些奇怪的事情來閱讀這些文字。爲什麼這麼多名單?你可以這樣做

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); 
      } 
    ); 

我希望這可以幫助,這是非常不清楚你想要什麼,因爲你的代碼中包含註釋和變量的代碼沒有定義

+0

之前我沒有使用過很多數組嗎?這會替換try語句中的所有內容嗎?對於所有的評論感到抱歉,我正在實施ArrayList,並將所有我知道部分工作的代碼註釋掉了,所以如果需要的話我可以回到舊的方式。 – feare56

+0

是的,它會取代。 – Redlab