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;
}
});
标签:jcombobox,file,swing,java 来源: https://codeday.me/bug/20191030/1966159.html