【问题标题】:Returning a list of audio filetypes返回音频文件类型列表
【发布时间】:2011-06-30 21:06:05
【问题描述】:

在回答这个问题时:I want to make a java program in which there is a combobox which displays the titles of all the files available in a folder

另一种实现答案的方法引起了我的注意; AudioSystem.getAudioFileTypes() 的用法返回指定文件夹中所有支持的音频文件。我是一个相当缺乏经验的编码人员,无法将此方法集成到我给定的答案中

File someFolder = new File("pathname");

Object[] wavFiles = someFolder.listFiles(wavExtensionFilenameFilter);
JComboBox songComboBox = new JComboBox(wavFiles);

谁能告诉我这是怎么做的?

【问题讨论】:

    标签: java audio javasound file-type


    【解决方案1】:

    以下源将显示一个JFileChooser,它特定于 Java Sound 可以理解的文件类型。一旦用户选择任何声音剪辑,应用程序。将获得该目录中所有剪辑的列表并将它们显示在一个组合中。

    在从组合中选择剪辑时,我们可以play the sound in a javax.sound.sample.Clip(或使用 Java Sound API 的其他方式),但我们选择了。对于使用Desktop打开文件(在系统默认播放器中)的1.6+“单线”。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.filechooser.FileNameExtensionFilter;
    import javax.sound.sampled.*;
    import java.io.*;
    
    class GetSoundsByFileType {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    AudioFileFormat.Type[] formatTypes = AudioSystem.getAudioFileTypes();
                    String[] types = new String[formatTypes.length];
                    for(int ii=0; ii<types.length; ii++) {
                        types[ii] = formatTypes[ii].getExtension();
                    }
    
                    FileTypesFilter fileTypesFilter = new FileTypesFilter(types);
                    // Just to confuse things, JFileChooser accepts a
                    // different type of filter!
                    FileNameExtensionFilter extensionFilter =
                        new FileNameExtensionFilter("Sound clips", types);
                    JFileChooser fc = new JFileChooser();
                    fc.setAcceptAllFileFilterUsed(false);
                    fc.addChoosableFileFilter(extensionFilter);
    
                    int result = fc.showOpenDialog(null);
                    if (result==JFileChooser.APPROVE_OPTION) {
                        File startAt = fc.getSelectedFile();
    
                        startAt = startAt.getParentFile();
                        File[] files = startAt.listFiles(fileTypesFilter);
    
                        final JComboBox clipCombo = new JComboBox(files);
                        clipCombo.addActionListener( new ActionListener(){
                                // 1.6+
                                Desktop desktop = Desktop.getDesktop();
    
                                public void actionPerformed(ActionEvent ae) {
                                    try {
                                        desktop.open( (File)clipCombo.getSelectedItem() );
                                    } catch(Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            } );
    
                        JOptionPane.showMessageDialog(null, clipCombo);
                    }
                }
            });
        }
    }
    
    class FileTypesFilter implements FilenameFilter {
    
        private String[] types;
    
        FileTypesFilter(String[] types ) {
            this.types = types;
        }
    
        public boolean accept(File dir, String name) {
            for (String type:types) {
                if (name.toLowerCase().endsWith(type.toLowerCase())) {
                    return true;
                }
            }
            return false;
        }
    }
    

    【讨论】:

    • 我想补充一点,我发现我的错误是我认为我可以将答案保留在几行代码中,并且仍然实现 AudioSystem.getAudioFileTypes()。感谢您的详细回复,它已经极大地澄清了事情:)
    • 对于“几行”的答案,我认为您的最终答案很好。 OTOH 这只有 73 行,这是一个包含文件选择器的独立示例! ;)
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多