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])
}
}*/
}
请采纳答案,支持我一下。
使用javafx的Media,MediaPlayer,MediaView。代码如下:
import java.io.Fileimport javafx.application.Application
import javafx.beans.binding.Bindings
import javafx.beans.property.ReadOnlyProperty
import javafx.beans.value.ObservableValue
import javafx.event.ActionEvent
import javafx.geometry.Pos
import javafx.scene.Scene
import javafx.scene.control.Button
import javafx.scene.control.Menu
import javafx.scene.control.MenuBar
import javafx.scene.control.MenuItem
import javafx.scene.control.Slider
import javafx.scene.image.Image
import javafx.scene.image.ImageView
import javafx.scene.layout.BorderPane
import javafx.scene.layout.HBox
import javafx.scene.layout.Pane
import javafx.scene.layout.VBox
import javafx.scene.media.Media
import javafx.scene.media.MediaPlayer
import javafx.scene.media.MediaPlayer.Status
import javafx.scene.media.MediaView
import javafx.stage.FileChooser
import javafx.stage.FileChooser.ExtensionFilter
import javafx.stage.Stage
import javafx.util.Duration
public class App extends Application {
private MediaView mediaView
private Slider processSlider
private static final Object AUTO = new Object(), MANUAL = new Object()
public static void main(String[] args) {
launch(args)
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("javafx视频播放器")
BorderPane root = new BorderPane()
// 菜单栏
initMenu(root)
// 视频播放控件
mediaView = initMediaView(root)
// 视频功能控件
initMediaControllView(root)
primaryStage.setScene(new Scene(root, 600, 400))
primaryStage.setOnCloseRequest(event -> System.exit(0))
primaryStage.show()
}
private MenuBar initMenu(final BorderPane parent) {
Menu menu = new Menu("菜单")
MenuItem item = new MenuItem("打开")
item.setOnAction(event -> {
FileChooser chooser = new FileChooser()
chooser.setTitle("选择视频文件")
chooser.getExtensionFilters().add(new ExtensionFilter("视频文件", "*.mp4", "*.flv"))
File file = chooser.showOpenDialog(parent.getScene().getWindow())
if (file != null) {
MediaPlayer player = mediaView.getMediaPlayer()
// 关闭当前的player
if (player != null) {
player.stop()
player.dispose()
}
processSlider.setValue(0)
// 创建一个新的player并自动播放
player = new MediaPlayer(new Media(file.toURI().toString()))
player.currentTimeProperty().addListener(this::mediaProcessChanged)
player.setAutoPlay(true)
mediaView.setMediaPlayer(player)
}
})
menu.getItems().add(item)
item = new MenuItem("退出")
item.setOnAction(event -> parent.getScene().getWindow().hide())
menu.getItems().add(item)
MenuBar menuBar = new MenuBar(menu)
parent.setTop(menuBar)
return menuBar
}
private MediaView initMediaView(final BorderPane parent) {
MediaView view = new MediaView()
Pane pane = new Pane(view)
parent.setCenter(pane)
// 视频宽高可随着窗口变化而自动缩放
view.fitWidthProperty().bind(Bindings.selectDouble(view.parentProperty(), "width"))
view.fitHeightProperty().bind(Bindings.selectDouble(view.parentProperty(), "height"))
view.setPreserveRatio(true)
return view
}
private void initMediaControllView(final BorderPane parent) {
VBox bottom = new VBox(10)
bottom.setAlignment(Pos.CENTER)
parent.setBottom(bottom)
Slider slider = new Slider(0, 100, 0)
slider.valueProperty().addListener(this::processSliderChanged)
// slider.setOnMouseClicked(this::processSliderClicked)
bottom.getChildren().add(slider)
processSlider = slider
HBox hbox = new HBox(10)
bottom.getChildren().add(hbox)
hbox.setAlignment(Pos.CENTER)
Button btn = new Button(null, new ImageView(loadImage("pause.png")))
btn.setOnAction(this::pauseOrPlay)
hbox.getChildren().add(btn)
btn = new Button(null, new ImageView(loadImage("stop.png")))
btn.setOnAction(this::stopPlay)
hbox.getChildren().add(btn)
}
private static Image loadImage(String resPath) {
return new Image(Thread.currentThread().getContextClassLoader().getResourceAsStream(resPath))
}
private void pauseOrPlay(ActionEvent event) {
MediaPlayer player = mediaView.getMediaPlayer()
if (player == null) {
return
}
Status status = player.getStatus()
if (status == Status.READY || status == Status.PAUSED) {
player.play()
((Button) event.getTarget()).setGraphic(new ImageView(loadImage("pause.png")))
} else if (status == Status.PLAYING) {
player.pause()
((Button) event.getTarget()).setGraphic(new ImageView(loadImage("play.png")))
}
}
private void stopPlay(ActionEvent event) {
MediaPlayer player = mediaView.getMediaPlayer()
if (player == null) {
return
}
player.stop()
}
// private void processSliderClicked(MouseEvent event) {
// Slider slider = (Slider) event.getSource()
// if (mediaView.getMediaPlayer() != null) {
// Duration d = mediaView.getMediaPlayer().getTotalDuration().multiply(slider.getValue() / slider.getMax())
// mediaView.getMediaPlayer().seek(d)
// }
// }
private void processSliderChanged(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
Slider slider = (Slider) ((ReadOnlyProperty<? extends Number>) observable).getBean()
if (slider.getUserData() == AUTO) { // 进度条是自动改变的,因此不用设置播放器
slider.setUserData(null)
return
}
if (mediaView.getMediaPlayer() != null) {
slider.setUserData(MANUAL)
Duration d = mediaView.getMediaPlayer().getTotalDuration().multiply(newValue.doubleValue() / slider.getMax())
mediaView.getMediaPlayer().seek(d)
}
}
private void mediaProcessChanged(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
if (processSlider.getUserData() == MANUAL) { // 手动点击进度条
processSlider.setUserData(null)
return
}
MediaPlayer player = (MediaPlayer) ((ReadOnlyProperty<? extends Duration>) observable).getBean()
processSlider.setUserData(AUTO)
processSlider.setValue(newValue.toMillis() / player.getTotalDuration().toMillis() * 100)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)