2016-02-04 73 views
0

嗨所以我试图添加一个文件列表到我的listView。 它通过调用listStack来创建一个vBox(视图/舞台创建在其他地方,这个类只提供某些功能) 在另一个类中创建一个文件目录列出文件夹。当从该列表中单击文件夹时,它将发送被单击的位置并使用构造函数将文件夹中的项目添加到列表中,以便用户可以单击它们。javafx Listview add items

TL; DR我只想传入一个字符串并获得该文件夹中文件的ListView。

请注意,我尝试过不同策略的很多注释行。 此外,当我点击它没有文件的文件夹,我得到Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

我的斗争是更新列表。 我很高兴回答您可能有的任何问题,并在必要时粘贴来自其他文件的代码。感谢您的时间。

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package musicmetadatak1009705; 

import java.io.File; 
import java.io.IOException; 
import java.util.Arrays; 
import java.util.List; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.VBox; 

/** 
* http://stackoverflow.com/questions/1844688/read-all-files-in-a-folder 
* 
* @author Scorchgid 
*/ 
public class FileTreeView { 

    private MainView mainView; 
    private ListView<File> listView = new ListView(); 
    private ObservableList<File> obvl = FXCollections.observableArrayList(); 
    private VBox vbox; 

    public ListView getListView() { 
     return listView; 
    } 

    public void setListView(ListView listView) { 
     this.listView = listView; 
    } 

    public FileTreeView() { 

    } 

    public FileTreeView(String dirName) throws IOException { 
     listView.setItems(null); 
     File dir = new File(dirName); 
     File[] files = dir.listFiles((File dir1, String filename) -> filename.endsWith(".mp3")); 
     ObservableList<File> oListStavaka = FXCollections.observableArrayList(files); 
     for (File file : files) { 
      System.out.println(file.toString()); 
     } 
     //List myList = Arrays.asList(files);   
     obvl.addAll(files); 
     obvl.set(0, dir); 
     listView.setItems(oListStavaka); 
     System.out.println("Obvl to string" + obvl.toString()); 
     System.out.println("Refersh"); 
     System.out.println(listView.getItems()); 
    } 

    //Files.walk(Paths.get(dir)).forEach((Path filePath) -> { 
    //if (Files.isRegularFile(filePath)) { 
    //System.out.println(filePath); 
    public VBox listStack() { 
     vbox = new VBox(); 
     vbox.getChildren().add(listView); 
     // Path path = null; 
     // File file = new File(path.toString()); 
     // listView.setRoot; 
     return vbox; 
    } 
} 

回答

1

试图回答这个问题将是困难的,因为这是我第一次,所以我会尽我所能。此外,我意识到它的技术上应该是FileListView我可能会稍后更改此名称

原本我试图做的是将io.File(s)列表添加到列表视图。然而,每次创建构造函数都是不正确的,因为我只需要一个FileTreeView对象。

当用户点击在文件夹视图的项目(如屏幕截图的前两列所示)它应该通过这需要该信息,并加载在ListView的所有文件在此文件夹路径FileTreeView。 Screenshot of Music Mohawk

来解决这个问题的方法是初始化,然后通过FileTreeView到FolderTreeView

(以下是一类被称为的MainView)

this.fileTreeView = new FileTreeView(musicDataModel, musicDataView); 
folderTreeView = new FolderTreeView(fileTreeView); 
... 
grid.addColumn(1, fileTreeView.listStack()); //Just so you know how listStack comes into play 

上的事件,当用户点击一个文件夹FolderTreeView运行这一行代码因此,不需要错误地初始化FileTreeView对象,它可以使用在初始化时传递的现有fileTreeView。这是来自FolderTreeView类。

fileTreeView.GetFilesFromFolder((newValue.getValue().toString())); 

最后这里是FileTreeView正确的代码。 请注意我只发布与我的问题有关的代码。 没有包含任何与屏幕截图第三列相关的代码。

package musicmetadatak1009705; 

import java.io.File; 
import java.io.IOException; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.VBox; 

/** 
* http://stackoverflow.com/questions/1844688/read-all-files-in-a-folder 
* http://stackoverflow.com/questions/35208522/javafx-listview-add-items 
* @author Scorchgid 
*/ 
public class FileTreeView { 

    public ObservableList<File> observableList; 
    private ListView<File> listView; 
    private VBox vbox; 

    public ListView getListView() { 
     return listView; 
    } 

    public void setListView(ListView listView) { 
     this.listView = listView; 
    } 

    public FileTreeView() { 
     this.observableList = FXCollections.observableArrayList(); 
     this.listView = new ListView(this.observableList); 
    } 

    public void GetFilesFromFolder(String dirName) throws IOException { 
     File dir = new File(dirName); 
     File[] files = dir.listFiles((File dir1, String filename) -> filename.endsWith(".mp3")); 
     observableList.clear(); 
     observableList.addAll(files); 
    } 

    public void SetFileTreeView() throws IOException { 
     listView.setItems(null); 
    } 

    public VBox listStack() throws IOException { 
     vbox = new VBox(); 
     vbox.getChildren().add(listView); 
     listView.setItems(observableList); 
     return vbox; 
    } 
} 
1

如果在目录中没有MP3文件,obvl执行行

obvl.set(0, dir); 

时仍然是空的。

由于没有索引为0的元素,所以引发异常。如果你想在前面加上dir到列表中,用add method

obvl.add(0, dir); 

BTW:全班有几个问题:

  • mainView场从未使用过。
  • 您似乎创建了第二个ObservableList看似没有理由。
  • listView.setItems(null);似乎不必要
  • ListView最初创建可能不被使用的,如果一个新的设定包含单个ListView
  • 多个VBox ES可被创建,其可以导致Node被使用多于一次
+0

应该只有一个Vbox,并且据我所见,它只能使用一次。 我相信有多个ObservableList因为我在摆弄并试图找到解决问题的方法。我想在listView中显示列表。我不知道如何做到这一点。 –