MediaPlayer.java
----------------------------------------------------------------------------
//程序主文件
import java.awt.*
import java.awt.event.*
import javax.swing.*
import javax.media.*
import java.io.*
import java.util.*//为了导入Vector
//import com.sun.java.swing.plaf.windows.*
public class MediaPlayer extends JFrame implements ActionListener,Runnable
{
private JMenuBar bar//菜单条
private JMenu fileMenu,choiceMenu,aboutMenu
private JMenuItem openItem,openDirItem,closeItem,about,infor
private JCheckBoxMenuItem onTop
private boolean top=false,loop//设定窗口是否在最前面
private Playerplayer//Play是个实现Controller的接口
private File file,listFile//利用File类结合JFileChooser进行文件打开 *** 作,后则与list.ini有关
private Container c
//private UIManager.LookAndFeelInfo[] look
private Stringtitle,listIniAddress//标题
private FileDialogfd
private JPanelpanel,panelSouth
private Icon icon//开始进入的时候要显示的图标,它为抽象类,不能自己创建链枝
private JLabellabel,listB//用来显示图标
private JList list//播放清单
private JScrollPane scroll//使播放清单具有滚动功能
private ListValueslistWriteFile//用于向文件中读取对象
private ObjectInputStream input//对象输入流
private ObjectOutputStream output//对象输出流
private JPopupMenupopupMenu//鼠标右键d出菜棚液敏单
private JMenuItem del,delAll,reName //d出菜单显示的菜单项,包括删除,全部删除和重命名
private VectorfileName,dirName,numList
private Stringfiles,dir
private int index//曲目指埋颤针
private Propertiesprop//获得系统属性
private int indexForDel//标志要删除的列表项目的索引
private ButtonGroup buttonGroup//控制按钮组
private JRadioButtonMenuItem[]buttonValues
private String[] content={"随机播放","顺序播放","单曲循环"}
private DialogDemodialog1
//private JDialogTest dialog2//用于显示播放清单
MediaPlayer()//构造函数
{
super("java音频播放器1.1版")//窗口标题
c=getContentPane()
c.setLayout(new BorderLayout())
//c.setBackground(new Color(40,40,95))
fileName=new Vector(1)
dirName=new Vector(1)
numList=new Vector(1)//构造三个容器用于支持播放清单
//vectorToString=new String[]
//prop=new Properties(System.getProperties())
//listIniAddress=prop.getProperty("user.dir")+"\\list.ini"
//listFile=new File(listIniAddress)//本来这些代码用来取的系统属性,后来
//发现根本就不用这么麻烦
listFile=new File("list.ini")//直接存于此目录
Thread readToList=new Thread(this)//注意编线程程序的时候要注意运行的时候含有的变量亿定义或者初始化,
//这就要求线程要等上述所说的情况下再运行,否则很容易发生错误或则异常
list=new JList()
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
list.setSelectionForeground(new Color(0,150,150))
list.setVisibleRowCount(10)
list.setFixedCellHeight(12)
list.setFixedCellWidth(250)
list.setFont(new Font("Serif",Font.PLAIN,12))
list.setBackground(new Color(40,40,95))
list.setForeground(new Color(0,128,255))
//list.setOpaque(false)
list.setToolTipText("点右键显示更多功能")//创建播放清单并设置各个属性
list.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if (e.getClickCount() == 2) //判断是否双击
{
index = list.locationToIndex(e.getPoint())//将鼠标坐标转化成list中的选项指针
createPlayer2()
//System.out.println("Double clicked on Item " + index),此是测试的时候加的
}
}
/* public void mousePressed(MouseEvent e)
{
checkMenu(e)//自定义函数,判断是否是右键,来决定是否显示菜单
}*/
public void mouseReleased(MouseEvent e)
{
checkMenu(e)//与上面的一样,判断是否鼠标右键
}
}
)
//listB=new JLabel(new ImageIcon("qingdan.gif"),SwingConstants.CENTER)
scroll=new JScrollPane(list)//用于存放播放列表
//dialog2=new JDialogTest(MediaPlayer.this,"播放清单",scroll)
//dialog2.setVisible(true)
readToList.start()//启动先程,加载播放列表
try
{
Thread.sleep(10)
}
catch(InterruptedException e)
{
e.printStackTrace()
}
/*look=UIManager.getInstalledLookAndFeels()
try
{
UIManager.setLookAndFeel(look[2].getClassName())
SwingUtilities.updateComponentTreeUI(this)
}
catch(Exception e)
{
e.printStackTrace()
}*///与下面的代码实现相同的功能,但执行速度要慢,原因:明显转了个大弯
/*try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName())
}
catch(Exception e)
{
e.printStackTrace()
} *///此段代码使执行速度大大降低
bar=new JMenuBar()
setJMenuBar(bar)//此两行创建菜单栏并放到此窗口程序
//bar.setBackground(new Color(48,91,183))
fileMenu=new JMenu("文件")
bar.add(fileMenu)
choiceMenu=new JMenu("控制")
bar.add(choiceMenu)
aboutMenu=new JMenu("帮助")
bar.add(aboutMenu)
openItem=new JMenuItem("打开文件")
openDirItem =new JMenuItem("打开目录")
closeItem =new JMenuItem("退出程序")
openItem.addActionListener(this)
openDirItem.addActionListener(this)
closeItem.addActionListener(this)
fileMenu.add(openItem)
fileMenu.add(openDirItem)
fileMenu.add(closeItem)
onTop=new JCheckBoxMenuItem("播放时位于最前面",top)
choiceMenu.add(onTop)
onTop.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(onTop.isSelected())
top=true
else top=false
setAlwaysOnTop(top)
}
}
)
choiceMenu.addSeparator()//加分割符号
buttonGroup=new ButtonGroup()
buttonValues=new JRadioButtonMenuItem[3]
for(int bt=0bt<3bt++)
{
buttonValues[bt]=new JRadioButtonMenuItem(content[bt])
buttonGroup.add(buttonValues[bt])
choiceMenu.add(buttonValues[bt])
}
buttonValues[0].setSelected(true)
choiceMenu.addSeparator()
/*loopItem=new JCheckBoxMenuItem("是否循环")
choiceMenu.add(loopItem)
loopItem.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
loop=!loop
}
}
)*/
infor=new JMenuItem("软件简介")
aboutMenu.add(infor)
infor.addActionListener(this)
about=new JMenuItem("关于作者")
about.addActionListener(this)
aboutMenu.add(about)
//菜单栏设置完毕
panel=new JPanel()
panel.setLayout(new BorderLayout())
c.add(panel,BorderLayout.CENTER)
panelSouth=new JPanel()
panelSouth.setLayout(new BorderLayout())
c.add(panelSouth,BorderLayout.SOUTH)
icon=new ImageIcon("icon\\Player.jpg")
label=new JLabel(icon)
panel.add(label)
popupMenu=new JPopupMenu()
del =new JMenuItem("删除")//鼠标右键d出菜单对象实例化
popupMenu.add(del)
del.addActionListener(this)
delAll =new JMenuItem("全部删除")
popupMenu.add(delAll)
delAll.addActionListener(this)
reName =new JMenuItem("重命名")
popupMenu.add(reName)
reName.addActionListener(this)
scroll=new JScrollPane(list)//用于存放播放列表
listB=new JLabel(new ImageIcon("icon\\qingdan.gif"),SwingConstants.CENTER)
panelSouth.add(listB,BorderLayout.NORTH)
panelSouth.add(scroll,BorderLayout.CENTER)
dialog1=new DialogDemo(MediaPlayer.this,"软件说明")
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)//设定窗口关闭方式
//this.setTitle("d")编译通过,说明可以再次设定标题
this.setLocation(400,250)//设定窗口出现的位置
//this.setSize(350,320)//窗口大小
setSize(350,330)
this.setResizable(false)//设置播放器不能随便调大小
this.setVisible(true)//此句不可少,否则窗口会不显示
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==openItem)//getSource()判断发生时间的组键
{
//System.out.println("d")测试用
openFile()
//createPlayer()
//setTitle(title)
}
if(e.getSource()==openDirItem)//打开目录
{
openDir()
}
if(e.getSource()==closeItem)//推出播放器
{
exity_n()
//System.exit(0)
}
if(e.getSource()==about)
{
JOptionPane.showMessageDialog(this,"此简易播放器由计科0302\n"
+"harly\n "+"完成",
"参与者",
JOptionPane.INFORMATION_MESSAGE)
}
if(e.getSource()==del)
{
//index
//delPaintList(index)
fileName.removeElementAt(indexForDel)
dirName.removeElementAt(indexForDel)
numList.removeAllElements()//从三个容器里面移除此项
Enumeration enumFile=fileName.elements()
while(enumFile.hasMoreElements())
{
numList.addElement((numList.size()+1)+"."+enumFile.nextElement())
//numList添加元素,显示播放里表中
}
//list.setListData(fileName)
list.setListData(numList)
if(index<indexForDel)
list.setSelectedValue(numList.elementAt(index),true)
else
{
if(index==indexForDel)
else
if(index!=0)
list.setSelectedValue(numList.elementAt(index-1),true)
}
//list.setSelectedIndex(index)
}
if(e.getSource()==delAll)//全部删除
{
fileName.removeAllElements()
dirName.removeAllElements()
numList.removeAllElements()
list.setListData(numList)
}
if(e.getSource()==reName)//重命名
{
String name//=JOptionPane.showInputDialog(this,"请输入新的名字")
try
{
name=reNames()
fileName.setElementAt(name,indexForDel)
numList.setElementAt((indexForDel+1)+"."+name,indexForDel)
}
catch(ReName e2)//自定义的异常
{
}
}
if(e.getSource()==infor)
{
dialog1.setVisible(true)
}
}
public static void main(String[] args)
{
final MediaPlayer mp=new MediaPlayer()
mp.setIconImage(new ImageIcon("icon\\mPlayer.jpg").getImage())//改变默认图标
mp.addWindowListener(new WindowAdapter()//注册窗口事件
{
public void windowClosing(WindowEvent e)
{
//System.exit(0)
mp.exity_n()
}
}
)
System.out.println("注意:更新文件列表后,请先正常关闭播放器"
+"\n然后再关闭此DOS窗口,否则导致播放列表不能保存!!")
}
private void openFile()//为了界面原因,此代码重写,估计兼容性不好了
{
/*JFileChooser fileChooser=new JFileChooser()//文件选择器
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY)//可以选择文件不能目录
int result=fileChooser.showOpenDialog(this)//创建文件打开对话框,并设定此程序为父窗口监控*/
/*通过result的值来判断文件是否打开成功
*JFileChooser类有很多静态成员变量
**/
/*if(result==JFileChooser.CANCEL_OPTION)
{
file=null//file已经在类中定义,如果选择取消,file指向为空
}
else
{
file=fileChooser.getSelectedFile()//获得文件对象
title=file.getAbsolutePath()//取得文件的绝对路径并且赋给title设定标题
}*/
//if(fd==null)
//{
//String filename="java音频播放器"
fd = new FileDialog(MediaPlayer.this)
//Filters fl=new Filters()
//fd.setFilenameFilter(fl)
fd.setVisible(true)
if (fd.getFile() != null)
{
title = fd.getDirectory() + fd.getFile()//原因请见同目录下的FileDialogDemo.java文件
files=fd.getFile()
//dir =fd.getDirectory()
file=new File(title)
createPlayer()
}
//title=filename
//fd=null//缺少此句如果第一次打开文件的时候取消 *** 作的时候第二次也不能打开文件了
//}
}
private void openDir()
{
JFileChooser fileChooser=new JFileChooser()
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
int result=fileChooser.showOpenDialog(MediaPlayer.this)
if(result==JFileChooser.CANCEL_OPTION)
return
file=fileChooser.getSelectedFile()
if(file==null||file.getName().equals(""))
JOptionPane.showMessageDialog(this,"错误的路径",
"出错了",JOptionPane.ERROR_MESSAGE)
String[] sFiles=file.list()
for(int i=0i<sFiles.lengthi++)
{
fileName.addElement(sFiles[i])
numList.addElement((numList.size()+1)+"."+sFiles[i])
dirName.addElement(file.getAbsolutePath()+"\\"+sFiles[i])
}
list.setListData(numList)
/*fd=new FileDialog(MediaPlayer.this)
fd.setVisible(true)
if(fd.getDirectory()!=null)
{
File fileDir=new File(fd.getDirectory())
String[] ss=fileDir.list()
for(int i=0i<ss.lengthi++)
{
System.out.println(ss[i])
}
}*/
}
请采纳答案,支持我一下。
双十一、双十二刚过,直播这个新的网购场景在消费者、电商平台、商家等多方眼中的分量仍在不断加嫌前重。java做直播平台在开发上需要用到摄像头采集、音视频编解码、流媒体协议等;在视频播放上,需要用到云服务等芹耐清,自身没有亩渗技术基础的可以考虑接入第三方直播平台的SDK来用。ZEGO即构是国内首创互动连麦技术的平台,他们的实时音视频产品支持32路实时音视频,语音支持44.1kHz全带音质,视频支持1080p高清画质,可以自适应复杂网络,保障流畅的直播体验。直播那么火,每个行业都想抓住这个机会做一番事业,利用孙磨java做直播需要用到的技术有很多,在开发上需要用到摄像头采集、音视频编解码、流媒体协议等等,在视频播放上,需要用到别人的云服务等。如果没有专业的技术建议还是找音视频直播领域的服务商渗拆来做,接入第三方直播平台的SDK做直播。即构科技的实时音视频产品支持32路实时音视频,1080P高清效果,运用抖动缓冲策略,找到延时与流畅间的最佳契则喊斗合点,具备超强的抗丢包能力。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)