javafx Listview添加项目

时间:2016-02-04 18:14:00

标签: arrays file listview javafx observablelist

嗨所以我正在尝试将一个文件列表添加到我的listView中。 它首先调用listStack来创建一个vBox(视图/ stage在别处创建,这个类只提供某些功能) 在另一个类中,创建一个列出文件夹的文件目录。当从该列表中单击文件夹时,它会发送单击的位置并使用构造函数将mp3文件夹中的项目添加到列表中,以便用户可以单击它们。

TL; DR我只想传入一个String并获取该文件夹中文件的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;
    }
}

2 个答案:

答案 0 :(得分:1)

如果目录中没有mp3文件,则行

obvl仍为空
obvl.set(0, dir);

已执行。

由于没有索引为0的元素,因此抛出异常。如果您想将dir添加到列表中,请使用add method

obvl.add(0, dir);
BTW:全班有几个问题:

  • 永远不会使用mainView字段。
  • 您似乎没有理由创建第二个ObservableList
  • listView.setItems(null);似乎没必要
  • 如果设置了新的<{1>},则可能不会使用最初创建的ListView
  • 可能会创建包含单个VBox的多个ListView es,这可能会导致Node被多次使用

答案 1 :(得分:1)

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

我最初尝试做的是将io.File列表添加到列表视图中。但是每次在构造函数中创建都是不正确的,因为我只需要一个FileTreeView对象。

当用户单击文件夹视图中的项目时(如屏幕截图的前两列所示),它应该将此文件夹路径传递给FileTreeView,后者将获取此信息并加载所有文件在listView中。 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;
    }
}