如何根据用户选择将文件文件夹添加到JavaFx中的ListControl?
我试图添加一个按钮,允许用户选择一个文件夹的wav文件,然后将其添加到一个列表控件,在那里可以选择播放它们。我最初创建了一个字符串变量,其中包含文件夹的路径,但现在希望允许用户选择一个文件夹,然后将其加载到ListControl中。当用户选择文件夹时,文件不会添加到ListControl。这是我到目前为止所拥有的。任何提示或提示都将不胜感激。提前谢谢如何根据用户选择将文件文件夹添加到JavaFx中的ListControl?,java,javafx,Java,Javafx,我试图添加一个按钮,允许用户选择一个文件夹的wav文件,然后将其添加到一个列表控件,在那里可以选择播放它们。我最初创建了一个字符串变量,其中包含文件夹的路径,但现在希望允许用户选择一个文件夹,然后将其加载到ListControl中。当用户选择文件夹时,文件不会添加到ListControl。这是我到目前为止所拥有的。任何提示或提示都将不胜感激。提前谢谢 public class Molly2b extends Application { private List<File> list
public class Molly2b extends Application {
private List<File> list = new ArrayList<File>();
private void init(final Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));
HBox hBox2 = new HBox();
hBox2.setSpacing(20);
hBox2.setTranslateY(30);
hBox2.getChildren().add(createChart());
final DirectoryChooser fileChooser = new DirectoryChooser();
final Button chooseDirButton = new Button("Choose Directory");
chooseDirButton.setOnAction(
new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
final DirectoryChooser dirChooser = new DirectoryChooser();
final File selectedDirectory = dirChooser.showDialog(primaryStage);
if (selectedDirectory != null) {
selectedDirectory.getAbsolutePath();
addFilesFromDir(selectedDirectory);
}
}
});
VBox vBox = new VBox(50);
vBox.getChildren().addAll(hBox2);
final ObservableList<File> listObserv = FXCollections.<File>observableList(list);
ListView<File> listView = new ListView<File>(listObserv);
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
listView.getSelectionModel().selectedItemProperty().addListener(
new ChangeListener<File>() {
public void changed(ObservableValue<? extends File> ov,
File old_val, File new_val) {
playAudio(new_val);
}
});
BorderPane bp = new BorderPane();
bp.setLeft(listView);
bp.setRight(vBox);
bp.setTop(chooseDirButton);
root.getChildren().add(bp);
}
public void addFilesFromDir(File dir){
if (dir.isDirectory()){
File[] loopsList = dir.listFiles();
for (File f:loopsList){
String s = f.getName();
if (s.endsWith(".wav")){
list.add(f);
}
}
}
}
public void playAudio(File file){
try{
AudioInputStream ais = AudioSystem.getAudioInputStream(file);
AudioFormat audioFormat = ais.getFormat();
DataLine.Info dataLineInfo = new DataLine.Info(Clip.class,audioFormat);
Clip clip = (Clip) AudioSystem.getLine(dataLineInfo);
clip.open(ais);
clip.setLoopPoints(0,-1);
clip.loop(0);
} catch (LineUnavailableException ex){
} catch (UnsupportedAudioFileException ef){
} catch (IOException e){
}
}
@Override
public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
公共类Molly2b扩展应用程序{
私有列表=新的ArrayList();
私有void init(最终阶段primaryStage){
组根=新组();
primaryStage.setScene(新场景(根));
HBox hBox2=新的HBox();
hBox2.设定起搏(20);
hBox2.setTranslateY(30);
hBox2.getChildren().add(createChart());
最终目录选择器fileChooser=新目录选择器();
最终按钮chooseDirButton=新建按钮(“选择目录”);
选择DirButton.setOnAction(
新的EventHandler(){
@凌驾
公共无效句柄(最终操作事件e){
最终目录选择器dirChooser=新目录选择器();
最终文件selectedDirectory=dirChooser.showDialog(primaryStage);
如果(selectedDirectory!=null){
selectedDirectory.getAbsolutePath();
addFilesFromDir(selectedDirectory);
}
}
});
VBox VBox=新的VBox(50);
vBox.getChildren().addAll(hBox2);
最终ObservableList Observ=FXCollections.ObservableList(列表);
ListView ListView=新ListView(listObserv);
listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
listView.getSelectionModel().SelectEditeProperty().addListener(
新的ChangeListener(){
public void已更改(observeValue您是指类似FileChooser或DirectoryChooser的东西吗
看来你改变了问题
public class Molly2b extends Application {
private URI path;
private FileChooser fileChooser;// = new FileChooser();
private ObservableList<File> listype;//
private ListView<String> listView;
private ListCell<String> listCell;
private void init(final Stage primaryStage) {
Group root = new Group();
HBox hBox2 = new HBox();
hBox2.setSpacing(20);
hBox2.setTranslateY(30);
listView = new ListView<>();
listCell = new ListCell<>();
final Button chooseDirButton = new Button("Choose Directory");
//listView.setCellFactory(TextFieldListCell.forListView());
chooseDirButton.setOnAction(
new EventHandler<ActionEvent>() {
@Override
public void handle(final ActionEvent e) {
fileChooser = new FileChooser();
listype = FXCollections.observableList();
fileChooser.showOpenMultipleDialog(primaryStage)
if (listype != null) {
for (int i = 0; i < listype.size(); i++) {
path = listype.get(i).toURI();
String filename = listype.get(i).getName();
listCell.setItem(filename);
final ObservableList olist = FXCollections
.observableArrayList();
olist.addListener(new InvalidationListener() {
@Override
public void invalidated(Observable o) {
listView.getItems();
}
});
olist.addListener(new ListChangeListener() {
@Override
public void onChanged(ListChangeListener.Change
change) {
change.getList();
listView.setItems(olist);
}
});
olist.setAll(listView.getItems());
olist.add(filename);
}
}
}
});
VBox vBox = new VBox(50);
vBox.getChildren().addAll(hBox2);
//listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
listView.getSelectionModel().selectedIndexProperty().addListener(
new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov,
Number oldValue, Number newValue) {
ov.getValue();
if(newValue.intValue == 0) {
listView.getItems().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable o) {
listCell.getIndex();
}
});
path = listype.get(newValue.intValue()).toURI();
}
try {
String newpath = path.toString();
playAudio(newpath);
} catch (IOException |
LineUnavailableException | UnsupportedAudioFileException e) {
}
}
});
BorderPane bp = new BorderPane();
bp.setLeft(listView);
bp.setRight(vBox);
bp.setTop(chooseDirButton);
root.getChildren().add(bp);
primaryStage.setScene(new Scene(root));
}
public void playAudio(String path) throws UnsupportedAudioFileException,
IOException, LineUnavailableException {
Media media = new Media(path);
final MediaPlayer player = new MediaPlayer(media);
player.play();
}
@Override
public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
公共类Molly2b扩展应用程序{
私有URI路径;
private FileChooser FileChooser;//=new FileChooser();
私有可观察列表列表类型;//
私有列表视图列表视图;
私有ListCell-ListCell;
私有void init(最终阶段primaryStage){
组根=新组();
HBox hBox2=新的HBox();
hBox2.设定起搏(20);
hBox2.setTranslateY(30);
listView=新建listView();
listCell=新listCell();
最终按钮chooseDirButton=新建按钮(“选择目录”);
//setCellFactory(TextFieldListCell.forListView());
选择DirButton.setOnAction(
新的EventHandler(){
@凌驾
公共无效句柄(最终操作事件e){
fileChooser=新建fileChooser();
ListType=FXCollections.observableList();
fileChooser.showOpenMultipleDialog(primaryStage)
如果(ListType!=null){
对于(int i=0;i public void已更改(observeValue问题是您从未将文件添加到列表视图
,而是仅将其添加到列表
。
如果要将它们添加到列表视图中,必须调用listView.getItems().add(f);
如果要将它们添加到列表中,则必须调用listView.getItems().add(f);
是列表。添加(f);
是否执行过?您所说的文件不添加到列表控件的确切含义是什么?发生了错误还是什么?没有列表。add(f);未执行,因此我为selectedDirectory创建了一个实例字段,现在已执行,但文件仍不会显示在列表视图中,但至少现在已添加到列表中。我的意思是什么都没有发生。没有错误它运行正常,但当我选择要添加的文件文件夹时,DirectoryChooser窗口关闭,但.wa该文件夹中的v文件没有添加到ListView中。我决定不使用MediaPlayer,因为我只想播放类似于鼓点循环的短声音,我最终想添加频率分析,但添加JavaFx附带的频率分析器(尽管很容易实现)是只读的。我让它运行,但它不会将文件添加到ListView,而且我想选择一个文件文件夹,而不是像DirectoryChooser中那样选择单个文件。它会像您可以选择的那样添加一个目录