2015-12-14 74 views
4

我有一個數組,其中包含位於另一個目錄中的目錄數量。然而,我的問題是我必須爲每個文件夾創建一個JPanel根據數組創建對象

例如:

File folder = new File("..."); 
File[] listOfFiles = folder.listFiles(); <- this contains the folders ({"folder1","folder2","folder3",...}). 

現在我不知道如何解決這個問題。

一些代碼,我已經寫了:

SystemAPI sapi = new SystemAPI(); <- custom written API 
File folder = new File(sapi.getHomeDir+"\\Documents\\*programname*\\default"); 
File[] listOfFiles = folder.listFiles(); 

    try{ 
     for (int i = 0; i < listOfFiles.length; i++) { 
      if (listOfFiles[i].isFile()) { 
       System.out.println(listOfFiles[i].getName()); 
      } else if (listOfFiles[i].isDirectory()) { 
       System.out.println(listOfFiles[i].getName()); 
      } 
     } 
    }catch(Exception a){ 
     JOptionPane.showMessageDialog(null, "Error Occurred", "Error Dialog", JOptionPane.ERROR_MESSAGE); 
    } 
+0

我們可以看到一些代碼,顯示你做了什麼,以及如何顯示在你的'JPanel'的目錄? – Dan

+0

我刪除了我的嘗試,因爲它只是使用同一個面板 –

+0

你在存儲和顯示你的目錄?你可以創建一個重複這個過程的方法。我將在下面的一個答案中發佈一個示例 – Dan

回答

2

你可以做這樣的事情(我把它利用MigLayout提供一個佈局,但可以改變)

import javax.swing.*; 
import java.awt.*; 
import net.miginfocom.swing.MigLayout; 
import java.io.*; 
import java.util.ArrayList; 
import java.awt.event.*; 
import javax.swing.event.*; 
import javax.swing.JTabbedPane; 

public class SimpleGUI 
{ 
    public JFrame myMainWindow = new JFrame("Multtiple directories"); 

    JPanel[] guiPanelS = new JPanel[1000]; 
    JScrollPane[] guiJSP = new JScrollPane[1000]; 
    public JTabbedPane tabbedPane = new JTabbedPane(); 
    int pI = 0; 
    String mainDirectory = "C:/Users/Daniel/Dropbox/Programming/Code/Notepad++/Java/Stack Overflow"; 
    String mainDirectoryName = new File(mainDirectory).getName(); 
    int indentForMainPanel = 30; 
    String parseIndent = Integer.toString(indentForMainPanel); 
    String lastDirOpen = mainDirectory; 
    String lastDirOpenBut = mainDirectory; 
    ArrayList<File> directoriesList = new ArrayList<File>(); 

    public void runGUI() 
    { 
     myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     myMainWindow.setLayout(new GridLayout(1,1)); 

     listFilesHD(new File(mainDirectory),mainDirectoryName); 

     final boolean showTabsHeader = false; 
     tabbedPane.setUI(new javax.swing.plaf.basic.BasicTabbedPaneUI() 
     { 
      @Override 
      protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount, int maxTabHeight) 
      { 
       if(showTabsHeader) 
       { 
        return super.calculateTabAreaHeight(tabPlacement, horizRunCount, maxTabHeight); 
       } 
       else 
       { 
        return 0; 
       } 
      } 
      protected void paintTabArea(Graphics g,int tabPlacement,int selectedIndex){} 
     }); 

     myMainWindow.getContentPane().add(tabbedPane); 
     tabbedPane.addChangeListener(new CustomChangeListener()); 

     myMainWindow.setVisible(true); 
     myMainWindow.setBounds(10,10,500,500); 
    } 

    public void listFilesHD(File f,String dName) 
    { 
     MigLayout layout = new MigLayout("wrap", "[grow]"); 
     guiPanelS[pI] = new JPanel(layout); 
     guiJSP[pI] = new JScrollPane(guiPanelS[pI]); 
     JLabel currentDir = new JLabel("Current Directory: "+dName); 
     guiPanelS[pI].add(currentDir,"align center"); 
     JLabel DirectoryName = new JLabel(dName); 
     DirectoryName.setForeground(Color.BLUE); 
     guiPanelS[pI].add(DirectoryName); 
     File[] listOfFiles = f.listFiles(); 

     JLabel[] listsValues = new JLabel[listOfFiles.length]; 
     JButton[] tabSwitch = new JButton[listOfFiles.length]; 

     int i=0; 
     int i2=0; 
     for(File fileTemp:listOfFiles) 
     { 
      listsValues[i] = new JLabel(listOfFiles[i].getName()); 
      if(listOfFiles[i].isDirectory()) 
      { 
       directoriesList.add(listOfFiles[i]); 
       tabSwitch[i2] = new JButton(listOfFiles[i].getName()); 
       tabSwitch[i2].setOpaque(false); //These remove the button filling and border 
       tabSwitch[i2].setContentAreaFilled(false); 
       tabSwitch[i2].setBorder(null); 
       tabSwitch[i2].setFocusable(false); 
       tabSwitch[i2].setForeground(Color.RED); 
       tabSwitch[i2].addActionListener(new openNewPaneActionListener()); 
       guiPanelS[pI].add(tabSwitch[i2],"gapLeft 30"); 
       i2++; 
      } 
      else if(listOfFiles[i].isFile()) 
      { 
       guiPanelS[pI].add(listsValues[i],"gapLeft 30"); 
      } 

      i++; 
     } 

     tabbedPane.addTab(f.getAbsolutePath(),guiJSP[pI]); 
     guiJSP[pI].getVerticalScrollBar().setUnitIncrement(16); 
     pI++; 
    } 

    public void listFilesSubD(File f,String dName,String dPath, String homeDirectory) 
    { 
     MigLayout layout = new MigLayout("wrap", "[grow]"); 
     guiPanelS[pI] = new JPanel(layout); 
     guiJSP[pI] = new JScrollPane(guiPanelS[pI]); 
     JLabel currentDir = new JLabel("Current Directory: "+dName); 
     guiPanelS[pI].add(currentDir,"align center"); 
     JButton homeDirectoryName = new JButton(homeDirectory); 
     homeDirectoryName.setForeground(Color.BLUE); 
     homeDirectoryName.addActionListener(new backListener()); 
     homeDirectoryName.setOpaque(false); //These remove the button filling and border 
     homeDirectoryName.setContentAreaFilled(false); 
     homeDirectoryName.setBorder(null); 
     homeDirectoryName.setFocusable(false); 
     guiPanelS[pI].add(homeDirectoryName); 

     if(!new File(lastDirOpenBut).getName().equals(mainDirectoryName)) 
     { 
      JButton lastDirectoryName = new JButton(new File(lastDirOpenBut).getName()); 
      lastDirectoryName.setForeground(Color.GREEN); 
      lastDirectoryName.addActionListener(new upOneListener()); 
      lastDirectoryName.setOpaque(false); 
      lastDirectoryName.setContentAreaFilled(false); 
      lastDirectoryName.setBorder(null); 
      lastDirectoryName.setFocusable(false); 
      guiPanelS[pI].add(lastDirectoryName,"gapLeft 30"); 

      File[] listOfFiles = f.listFiles(); 

      JLabel[] listsValues = new JLabel[listOfFiles.length]; 
      JButton[] tabSwitch = new JButton[listOfFiles.length]; 

      int i=0; 
      int i2=0; 
      for(File fileTemp:listOfFiles) 
      { 
       listsValues[i] = new JLabel(listOfFiles[i].getName()); 
       if(listOfFiles[i].isDirectory()) 
       { 
        directoriesList.add(listOfFiles[i]); 
        tabSwitch[i2] = new JButton(listOfFiles[i].getName()); 
        tabSwitch[i2].setOpaque(false); 
        tabSwitch[i2].setContentAreaFilled(false); 
        tabSwitch[i2].setBorder(null); 
        tabSwitch[i2].setFocusable(false); 
        tabSwitch[i2].setForeground(Color.RED); 
        tabSwitch[i2].addActionListener(new openNewPaneActionListener()); 
        guiPanelS[pI].add(tabSwitch[i2],"gapLeft 60"); 
        i2++; 
       } 
       else if(listOfFiles[i].isFile()) 
       { 
        guiPanelS[pI].add(listsValues[i],"gapLeft 60"); 
       } 
       i++; 
      } 
     } 
     else 
     { 
      File[] listOfFiles = f.listFiles(); 

      JLabel[] listsValues = new JLabel[listOfFiles.length]; 
      JButton[] tabSwitch = new JButton[listOfFiles.length]; 

      int i=0; 
      int i2=0; 
      for(File fileTemp:listOfFiles) 
      { 
       listsValues[i] = new JLabel(listOfFiles[i].getName()); 
       if(listOfFiles[i].isDirectory()) 
       { 
        directoriesList.add(listOfFiles[i]); 
        tabSwitch[i2] = new JButton(listOfFiles[i].getName()); 
        tabSwitch[i2].setOpaque(false); //These remove the button filling and border 
        tabSwitch[i2].setContentAreaFilled(false); 
        tabSwitch[i2].setBorder(null); 
        tabSwitch[i2].setFocusable(false); 
        tabSwitch[i2].setForeground(Color.RED); 
        tabSwitch[i2].addActionListener(new openNewPaneActionListener()); 
        guiPanelS[pI].add(tabSwitch[i2],"gapLeft 30"); 
        i2++; 
       } 
       else if(listOfFiles[i].isFile()) 
       { 
        guiPanelS[pI].add(listsValues[i],"gapLeft 30"); 
       } 
       i++; 
      } 
     } 

     if(tabbedPane.indexOfTab(dPath)==-1) 
     { 
      tabbedPane.addTab(dPath,guiJSP[pI]); 
     } 

     guiJSP[pI].getVerticalScrollBar().setUnitIncrement(16); 
     pI++; 
    } 

    public static void main(String[] args) 
    { 
     SimpleGUI sG = new SimpleGUI(); 
     sG.runGUI(); 
    } 

    class openNewPaneActionListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      lastDirOpenBut = tabbedPane.getTitleAt(tabbedPane.getSelectedIndex()); 
      String butSrcTxt = ""; 
      Object source = e.getSource(); 
      if (source instanceof JButton) 
      { 
       JButton btn = (JButton)source; 
       butSrcTxt = btn.getText(); 
      } 

      boolean tF = false; 
      File fMain = new File(""); 
      for(File f:directoriesList) 
      { 
       if(f.getName().equals(butSrcTxt)) 
       { 
        fMain = f; 
        tF = true; 
       } 
      } 

      if(tF) 
      { 
       if(tabbedPane.indexOfTab(fMain.getAbsolutePath())==-1) 
       { 
        listFilesSubD(fMain, butSrcTxt, fMain.getAbsolutePath(),mainDirectoryName); 
       } 

       tabbedPane.setSelectedIndex(tabbedPane.indexOfTab(fMain.getAbsolutePath())); 
      } 

     } 
    } 

    class upOneListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      tabbedPane.setSelectedIndex(tabbedPane.indexOfTab(lastDirOpen)); 
     } 
    } 

    class CustomChangeListener implements ChangeListener 
    { 
     @Override 
     public void stateChanged(ChangeEvent e) 
     { 
      lastDirOpen = tabbedPane.getTitleAt(tabbedPane.getSelectedIndex()); 
      int endIndex = lastDirOpen.lastIndexOf(Character.toString((char) 92)); 
      if (endIndex != -1) 
      { 
       lastDirOpen = lastDirOpen.substring(0, endIndex); 
      } 
     } 
    } 

    class backListener implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      tabbedPane.setSelectedIndex(0); 
     } 
    } 
} 

的代碼產生一個簡單的GUI(如下圖所示)。該圖顯示了當前打開的目錄。藍色按鈕是點擊時打開的主目錄。打開目錄中的文件是黑色的。子目錄是紅色的按鈕,當點擊打開一個包含該目錄內容的新面板時,最後綠色按鈕是當前打開的目錄上方的目錄。例如,如果您在單擊綠色按鈕時處於C:\\D\B,則應輸入C:\\D

所有面板都在JScrollPane上,所以您不必擔心目錄中文件的數量。您現在可以將此代碼改編爲您自己的代碼。如果你還沒有,我建議你得到MigLayout,這樣你就可以看到這個小程序是如何工作的。

Pic of compiled code

+0

讓我爲你更好地描述它,我有我的'JFrame',我也有一個包含其他目錄的目錄。現在我似乎無法弄清楚如何將這些「JPanels」添加到「JFrame」中,在每個「JPanel」中,還必須有在主目錄中找到的目錄名稱。 –

+0

@JarnoGabriël我明白你的意思了。我目前正在工作,但當我回到實施更改時將再次更改代碼。 – Dan

+1

謝謝,我喜歡'JScrollPane'的想法,但沒有想到。 –