如何根据用户选择将文件文件夹添加到JavaFx中的ListControl?

如何根据用户选择将文件文件夹添加到JavaFx中的ListControl?,java,javafx,Java,Javafx,我试图添加一个按钮,允许用户选择一个文件夹的wav文件,然后将其添加到一个列表控件,在那里可以选择播放它们。我最初创建了一个字符串变量,其中包含文件夹的路径,但现在希望允许用户选择一个文件夹,然后将其加载到ListControl中。当用户选择文件夹时,文件不会添加到ListControl。这是我到目前为止所拥有的。任何提示或提示都将不胜感激。提前谢谢 public class Molly2b extends Application { private List<File> list

我试图添加一个按钮,允许用户选择一个文件夹的wav文件,然后将其添加到一个列表控件,在那里可以选择播放它们。我最初创建了一个字符串变量,其中包含文件夹的路径,但现在希望允许用户选择一个文件夹,然后将其加载到ListControl中。当用户选择文件夹时,文件不会添加到ListControl。这是我到目前为止所拥有的。任何提示或提示都将不胜感激。提前谢谢

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;ipublic void已更改(observeValue问题是您从未将文件添加到
列表视图
,而是仅将其添加到
列表

如果要将它们添加到
列表视图中,必须调用
listView.getItems().add(f);
如果要将它们添加到
列表中,则必须调用
listView.getItems().add(f);
列表。添加(f);
是否执行过?您所说的
文件不添加到列表控件的确切含义是什么?发生了错误还是什么?没有列表。add(f);未执行,因此我为selectedDirectory创建了一个实例字段,现在已执行,但文件仍不会显示在列表视图中,但至少现在已添加到列表中。我的意思是什么都没有发生。没有错误它运行正常,但当我选择要添加的文件文件夹时,DirectoryChooser窗口关闭,但.wa该文件夹中的v文件没有添加到ListView中。我决定不使用MediaPlayer,因为我只想播放类似于鼓点循环的短声音,我最终想添加频率分析,但添加JavaFx附带的频率分析器(尽管很容易实现)是只读的。我让它运行,但它不会将文件添加到ListView,而且我想选择一个文件文件夹,而不是像DirectoryChooser中那样选择单个文件。它会像您可以选择的那样添加一个目录