【问题标题】:javafx Listview add itemsjavafx Listview 添加项目
【发布时间】:2016-02-04 18:14:00
【问题描述】:

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

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

【问题讨论】:

    标签: arrays file listview javafx observablelist


    【解决方案1】:

    如果目录下没有mp3文件,则obvl该行时仍为空

    obvl.set(0, dir);
    

    被执行。

    由于没有索引为 0 的元素,因此会引发异常。如果您想在列表前添加dir,请使用add method

    obvl.add(0, dir);
    

    顺便说一句:整个班级有几个问题:

    • mainView 字段从未使用过。
    • 您似乎无缘无故地创建了第二个ObservableList
    • listView.setItems(null); 似乎没必要
    • 如果设置了新的ListView,则最初创建的ListView 可能无法使用
    • 可能会创建包含单个ListView 的多个VBoxes,这可能导致Node 被多次使用

    【讨论】:

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

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

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

    当用户在文件夹视图中单击一个项目时(如屏幕截图的前两列所示),它应该将此文件夹路径传递给 FileTreeView,它会获取此信息并加载所有文件在列表视图中。

    解决这个问题的方法是初始化然后将 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多