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

时间:2013-11-12 02:10:29

标签: java swing file jcombobox

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

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

playListHolder.getSelectedItem()

我想要做的是,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); } } 中的歌曲文件只显示文件名,而不是JComboBoxfile.toString()中设置的整个路径。

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

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

我确信只是我的业余知识水平正在创造这个绊脚石,必须有一个简单的方法来做到这一点,但不管你信不信,我似乎找不到一个,至少不是一个用我容易理解的方式写的。任何帮助深表感谢。

2 个答案:

答案 0 :(得分:3)

我认为这就是你要找的东西,为你的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

答案 1 :(得分:1)

在屏幕上格式化内容通常属于渲染器。在这种情况下,ListCellRenderer

查看How to use combo boxes,特别是Providing a Custom Renderer