2015-12-14 129 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'的想法,但没有想到。 –