javafx Listview 添加项目
javafx Listview add items
您好,我正在尝试将文件列表添加到我的 listView。
它首先调用 listStack 来创建一个 vBox(view/stage 是在别处创建的,这个 class 只是提供某些功能)
在另一个 class 中创建了一个文件目录,其中列出了文件夹。当从此列表中单击文件夹时,它会发送被单击的位置,并使用构造函数将文件夹中的 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;
/**
*
*
* @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;
}
}
如果目录中没有mp3文件,obvl
行
时仍然是空的
obvl.set(0, dir);
被执行。
由于没有索引为 0 的元素,因此抛出异常。如果要将 dir
添加到列表中,请使用 add
method:
obvl.add(0, dir);
顺便说一句:整个class有几个问题:
- 从未使用过
mainView
字段。
- 您似乎毫无理由地创建了第二个
ObservableList
。
listView.setItems(null);
好像没必要
- 最初创建的
ListView
可能无法使用,如果设置了新的
- 可能会创建包含单个
ListView
的多个 VBox
es,这可能会导致 Node
被多次使用
第一次尝试回答这个问题会很困难,所以我会尽力而为。我也意识到它在技术上应该是 FileListView 我稍后可能会更改此名称
我最初想做的是将 io.File(s) 的列表添加到列表视图。但是每次在构造函数中创建都是不正确的,因为我只需要一个 FileTreeView 对象。
当用户单击文件夹视图中的项目时 (如屏幕截图的前两列所示) 它应该将此文件夹路径传递给获取此信息的 FileTreeView并加载 listView 中的所有文件。
解决这个问题的方法是初始化然后将 FileTreeView 传递给 FolderTreeView
(以下来自一个叫MainView的class)
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 class.
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;
/**
*
*
* @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;
}
}
您好,我正在尝试将文件列表添加到我的 listView。 它首先调用 listStack 来创建一个 vBox(view/stage 是在别处创建的,这个 class 只是提供某些功能) 在另一个 class 中创建了一个文件目录,其中列出了文件夹。当从此列表中单击文件夹时,它会发送被单击的位置,并使用构造函数将文件夹中的 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;
/**
*
*
* @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;
}
}
如果目录中没有mp3文件,obvl
行
obvl.set(0, dir);
被执行。
由于没有索引为 0 的元素,因此抛出异常。如果要将 dir
添加到列表中,请使用 add
method:
obvl.add(0, dir);
顺便说一句:整个class有几个问题:
- 从未使用过
mainView
字段。 - 您似乎毫无理由地创建了第二个
ObservableList
。 listView.setItems(null);
好像没必要- 最初创建的
ListView
可能无法使用,如果设置了新的 - 可能会创建包含单个
ListView
的多个VBox
es,这可能会导致Node
被多次使用
第一次尝试回答这个问题会很困难,所以我会尽力而为。我也意识到它在技术上应该是 FileListView 我稍后可能会更改此名称
我最初想做的是将 io.File(s) 的列表添加到列表视图。但是每次在构造函数中创建都是不正确的,因为我只需要一个 FileTreeView 对象。
当用户单击文件夹视图中的项目时 (如屏幕截图的前两列所示) 它应该将此文件夹路径传递给获取此信息的 FileTreeView并加载 listView 中的所有文件。
解决这个问题的方法是初始化然后将 FileTreeView 传递给 FolderTreeView
(以下来自一个叫MainView的class)
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 class.
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;
/**
*
*
* @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;
}
}