编程语言
首页 > 编程语言> > java-编辑文件名在JComboBox中的显示方式,同时保持对文件的访问

java-编辑文件名在JComboBox中的显示方式,同时保持对文件的访问

作者:互联网

我是Java的新手,也是堆栈溢出的新手.

我正在尝试使用JMF API创建一个用Java编码的简单媒体播放器.到目前为止,我已经能够使用名为playListHolder的JComboBox设置一个简单的队列/播放列表来保存歌曲文件.当用户从菜单栏中选择打开时,他们会从JFileChooser中选择要添加的歌曲.然后使用addItem()方法将歌曲文件添加到playListHolder.当在playListHolder中选择一个项目并且用户单击播放按钮时,将使用playListHolder.getSelectedItem()向File对象文件分配要播放的项目.下面的代码部分和相关变量:

File file;

Player p;

Component cont;

Container c;

Component visual;

JButton play = new JButton("Play");

play.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                file = (File) playListHolder.getSelectedItem();
                startplay();
            }
        }); 
public void openFile() { 
                JFileChooser filech = new JFileChooser();

        int result = filech.showOpenDialog(this);

        if (result == JFileChooser.CANCEL_OPTION) {
            file = null;
        } else {
            file = filech.getSelectedFile();
            playListHolder.addItem(file);
            ;
        }
    }


public void startplay() {

        if (file == null)
            return;
        removepreviousplayer();
        try {
            p = Manager.createPlayer(file.toURI().toURL());
            p.addControllerListener(new ControllerListener() {
                public void controllerUpdate(ControllerEvent ce) {
                    if (ce instanceof RealizeCompleteEvent) {
                        c = getContentPane();
                        cont = p.getControlPanelComponent();
                        visual = p.getVisualComponent();
                        if (visual != null)
                            c.add(visual, BorderLayout.CENTER);
                        if (cont != null)
                            c.add(cont, BorderLayout.SOUTH);
                        c.doLayout();
                    }
                }
            });
            p.start();
        }

        catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Invalid file or location",
                    "Error loading file", JOptionPane.ERROR_MESSAGE);

        }
    }

我想做的是将歌曲文件显示在JComboBox中,而只使用文件名,而不是file.toString()在JComboBox中设置的完整路径.

到目前为止,我只是尝试将file.getName()添加到框中,但是很快意识到我的笨拙.这样做只会在框中添加文件名的字符串,这样,当您使用媒体播放器中的播放按钮实际播放文件时,它将无法找到文件并引发异常.

我还尝试创建一个具有toString()方法的FileWrapper类,该方法利用file.getName()方法仅返回文件名,然后将该FileWrapper添加到框中而不是直接添加到文件对象中.我得到了相同的结果.

我敢肯定,正是我的业余知识水平正在创造这个绊脚石,必须有一种简单的方法来做到这一点,但无论是否相信我似乎都找不到,至少没有一个用书面形式写成.我很容易理解的方式.任何帮助深表感谢.

解决方法:

我想这就是您要寻找的东西,为您的comboBox创建一个自定义渲染器

myComboBox.setRenderer( new DefaultListCellRenderer(){

        @Override  
        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);
                if(value == null){
                     return this;    
                }

                if(value instanceof File){
                  File song = (File)value;
                  setText(song.getName());
                }else{
                  setText(value.toString());
                }
            return this;
        }
});

阅读更多How to use ComboBox

标签:jcombobox,file,swing,java
来源: https://codeday.me/bug/20191030/1966159.html