我是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);
}
}
中的歌曲文件只显示文件名,而不是JComboBox
在file.toString()
中设置的整个路径。
到目前为止,我尝试将JComboBox
添加到框中,但很快意识到我的无聊。这样做只会在文件夹中添加file.getName()
文件名,这样当您使用媒体播放器中的String
按钮实际播放文件时,它无法找到该文件并引发异常。
我还尝试创建一个play
类,其中FileWrapper
方法使用toString()
方法只返回文件名,然后将file.getName()
添加到框而不是直接的文件对象。我得到了相同的结果。
我确信只是我的业余知识水平正在创造这个绊脚石,必须有一个简单的方法来做到这一点,但不管你信不信,我似乎找不到一个,至少不是一个用我容易理解的方式写的。任何帮助深表感谢。
答案 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;
}
});
答案 1 :(得分:1)
在屏幕上格式化内容通常属于渲染器。在这种情况下,ListCellRenderer
。