Java运用jnavlcj实现音乐和视频的播放器1主界面设计
白雨青工作站发文地址:Java运用jna、vlcj实现音乐和视频的播放器1主界面设计白雨青工作站
一、播放器主框架publicclassMainFrame{publicJFrameframe;publicintwidth100;publicintheight350;publicMainFrame(){framenewJFrame();frame。setResizable(false);frame。setDefaultCloseOperation(JFrame。EXITONCLOSE);frame。setSize(height,width);frame。setLocationRelativeTo(null);frame。setLayout(null);去掉窗口的装饰frame。setUndecorated(true);采用指定的窗口装饰风格frame。getRootPane()。setWindowDecorationStyle(JRootPane。NONE);设置窗体圆角,最后两个参数分别为圆角的宽度、高度数值,一般这两个数值都是一样的AWTUtilities。setWindowShape(frame,newRoundRectangle2D。Double(0。0D,0。0D,frame。getWidth(),frame。getHeight(),20。0D,20。0D));设置背景颜色,记住一定要修改frame。getContentPane()的颜色,因为我们看到的都是这个的颜色而并不是frame的颜色frame。getContentPane()。setBackground(Color。LIGHTGRAY);frame。setVisible(true);}}
效果:
二、绘制自定义窗口,添加最小化和关闭按钮
1、自定义一个button类继承JButtonimportjavax。swing。JButton;publicclassDIYButtonextendsJButton{publicDIYButton(){super();TODOAutogeneratedconstructorstub不绘制边框setBorderPainted(false);按钮设置为透明,这样就不会挡着后面的背景setContentAreaFilled(false);}}
2、自定义一个panel,里面存放logo,窗口名称,最小化,关闭按钮importjava。awt。Color;importjava。awt。event。ActionEvent;importjava。awt。event。ActionListener;importjavax。swing。ImageIcon;importjavax。swing。JFrame;importjavax。swing。JLabel;importjavax。swing。JPanel;publicclassMainFrameBarextendsJPanelimplementsActionListener{privateJLabeltitleLabel;privateDIYButtonwinbtnlogo;privateDIYButtonwinbtnmin;privateDIYButtonwinbtnclose;publicMainFrameBar(){winbtnlogonewDIYButton();winbtnlogo。setBounds(10,5,16,16);winbtnlogo。setIcon(newImageIcon(iconwinbtnlogo。png));titleLabelnewJLabel();titleLabel。setBounds(28,3,80,20);winbtnminnewDIYButton();winbtnmin。setBounds(300,5,16,16);winbtnmin。setIcon(newImageIcon(iconwinbtnmin。png));winbtnclosenewDIYButton();winbtnclose。setBounds(320,5,16,16);winbtnclose。setIcon(newImageIcon(iconwinbtnclose。png));setBackground(Color。gray);setLayout(null);add(titleLabel);add(winbtnlogo);add(winbtnmin);add(winbtnclose);winbtnmin。setActionCommand(min);winbtnclose。setActionCommand(close);winbtnmin。addActionListener(this);winbtnclose。addActionListener(this);}publicvoidactionPerformed(ActionEvente){if(e。getActionCommand()min){MainFrame。getFrame()。setExtendedState(JFrame。ICONIFIED);}if(e。getActionCommand()close){System。exit(0);}}publicJLabelgetTitleLabel(){returntitleLabel;}publicvoidsetTitleLabel(JLabeltitleLabel){this。titleLabeltitleLabel;}publicDIYButtongetWinbtnlogo(){returnwinbtnlogo;}publicvoidsetWinbtnlogo(DIYButtonwinBtnLogo){winbtnlogowinBtnLogo;}publicDIYButtongetWinbtnmin(){returnwinbtnmin;}publicvoidsetWinbtnmin(DIYButtonwinBtnMin){winbtnminwinBtnMin;}publicDIYButtongetWinbtnclose(){returnwinbtnclose;}publicvoidsetWinbtnclose(DIYButtonwinBtnClose){winbtnclosewinBtnClose;}}
效果:
三、绘制中间区域
1、自定义播放器进度条importjava。awt。Color;importjava。awt。Font;importjavax。swing。JLabel;importjavax。swing。JPanel;播放器进度条publicclassRateextendsJPanel{privateJLabelrate;publicRate(){super();TODOAutogeneratedconstructorstubsetLayout(null);setBackground(newColor(255,255,255));ratenewJLabel(,JLabel。CENTER);rate。setForeground(newColor(255,255,255));rate。setVisible(true);rate。setFont(newFont(Font。DIALOG,0,25));add(rate);setVisible(true);}}
2、进度条风格importjavax。swing。;importjavax。swing。plaf。basic。BasicSliderUI;importjava。awt。;publicclassSliderStyleextendsBasicSliderUI{publicSliderStyle(JSliderjSlider){super(jSlider);}重绘游标publicvoidpaintThumb(Graphicsg){Graphics2Dg2d(Graphics2D)g;BasicStrokestrokenewBasicStroke(3,BasicStroke。CAPROUND,BasicStroke。JOINROUND);g2d。setStroke(stroke);g2d。setComposite(AlphaComposite。getInstance(AlphaComposite。SRCOVER,1));g2d。setRenderingHint(RenderingHints。KEYANTIALIASING,RenderingHints。VALUEANTIALIASON);GradientPaintgpnewGradientPaint(0,0,newColor(255,255,255),0,thumbRect。height,newColor(255,255,255));g2d。setPaint(gp);g2d。fillOval(thumbRect。x,thumbRect。y5,10,10);BasicStrokestroke1newBasicStroke(3,BasicStroke。CAPROUND,BasicStroke。JOINROUND);g2d。setStroke(stroke1);g2d。drawLine(0,thumbRect。height2,thumbRect。x8,thumbRect。height2);}重绘进度条publicvoidpaintTrack(Graphicsg){Graphics2Dg2d(Graphics2D)g;g2d。setRenderingHint(RenderingHints。KEYANTIALIASING,RenderingHints。VALUEANTIALIASOFF);设定渐变g2d。setComposite(AlphaComposite。getInstance(AlphaComposite。SRCOVER,0。3f));g2d。setPaint(newGradientPaint(0,0,newColor(200,200,200),0,trackRect。height,newColor(255,255,255),true));g2d。setStroke(newBasicStroke(3,BasicStroke。CAPROUND,BasicStroke。JOINROUND));g2d。drawLine(8,trackRect。height21,trackRect。width8,trackRect。height21);}}
3、自定义一个panel,存放上一首、下一首、播放暂停按钮、当前时间、总时间、进度条、歌曲名称importjava。awt。Color;importjava。awt。Cursor;importjava。awt。event。ActionEvent;importjava。awt。event。ActionListener;importjava。awt。event。MouseAdapter;importjava。awt。event。MouseEvent;importjavax。swing。ImageIcon;importjavax。swing。JLabel;importjavax。swing。JPanel;importjavax。swing。JSlider;importcom。byq。player。ui。component。Rate;importcom。byq。player。ui。style。SliderStyle;publicclassMainFrameContainextendsJPanelimplementsActionListener{privateDIYButtonwinbtnprev;privateDIYButtonwinbtnplay;privateDIYButtonwinbtnnext;privateRaterate;进度条privateJLabelmediaName;privateJLabelcurrentTime;privateJLabeltotalTime;privateJSliderplayProcessSlider;privateintlen10;publicMainFrameContain(){winbtnprevnewDIYButton();winbtnprev。setBounds(len,3,40,40);winbtnprev。setIcon(newImageIcon(iconwinbtnprev。png));winbtnprev。setActionCommand(prev);add(winbtnprev);winbtnplaynewDIYButton();winbtnplay。setBounds(len50,3,40,40);winbtnplay。setIcon(newImageIcon(iconwinbtnplay。png));winbtnplay。setActionCommand(play);add(winbtnplay);winbtnnextnewDIYButton();winbtnnext。setBounds(len100,3,40,40);winbtnnext。setIcon(newImageIcon(iconwinbtnnext。png));winbtnnext。setActionCommand(next);add(winbtnnext);歌名mediaNamenewJLabel();mediaName。setBounds(len165,5,300,30);mediaName。setForeground(newColor(255,255,255));add(mediaName);ratenewRate();rate。setBounds(len200,30,100,3);add(rate);setBackground(Color。gray);setLayout(null);当前时间currentTimenewJLabel(00:00);currentTime。setBounds(len165,15,50,30);currentTime。setForeground(newColor(255,255,255));add(currentTime);结束时间totalTimenewJLabel(00:00);totalTime。setBounds(len305,15,50,30);totalTime。setForeground(newColor(255,255,255));add(totalTime);playProcessSlidernewJSlider(0,100,0);playProcessSlider。setBounds(len200,20,100,24);playProcessSlider。setUI(newSliderStyle(playProcessSlider));playProcessSlider。setBackground(newColor(125,125,125));playProcessSlider。setCursor(Cursor。getPredefinedCursor(Cursor。HANDCURSOR));add(playProcessSlider);winbtnprev。addActionListener(this);winbtnplay。addActionListener(this);winbtnnext。addActionListener(this);}publicvoidactionPerformed(ActionEvente){TODOAutogeneratedmethodstubif(e。getActionCommand()prev){System。out。println(prev);}if(e。getActionCommand()play){System。out。println(play);winbtnplay。setIcon(newImageIcon(iconwinbtnpause。png));winbtnplay。setActionCommand(pause);}if(e。getActionCommand()next){System。out。println(next);}if(e。getActionCommand()pause){System。out。println(pause);winbtnplay。setIcon(newImageIcon(iconwinbtnplay。png));winbtnplay。setActionCommand(play);}}}
效果:
四、绘制下面区域,菜单列表按钮,声音控制条
1、自定义音量控制条importjava。awt。Color;importjava。awt。Font;importjavax。swing。JLabel;importjavax。swing。JPanel;声音进度条publicclassVolumeextendsJPanel{privateJLabelvolume;publicVolume(){super();TODOAutogeneratedconstructorstubsetLayout(null);setBackground(newColor(255,255,255));volumenewJLabel(,JLabel。CENTER);volume。setForeground(newColor(255,255,255));volume。setVisible(true);volume。setFont(newFont(Font。DIALOG,0,25));add(volume);setVisible(true);}}
2、自定义一个panel,存放音量控制条和菜单按钮importjava。awt。Color;importjava。awt。Cursor;importjava。awt。event。ActionEvent;importjava。awt。event。ActionListener;importjavax。swing。ImageIcon;importjavax。swing。JPanel;importjavax。swing。JSlider;importcom。byq。player。ui。component。Volume;importcom。byq。player。ui。style。SliderStyle;publicclassMainFrameBottomextendsJPanelimplementsActionListener{privateDIYButtonwinbtnlist;privateDIYButtonwinbtnvolume;privateVolumevolume;privateJSlidervolumeSlider;privateintlen10;publicMainFrameBottom(){TODOAutogeneratedconstructorstubwinbtnlistnewDIYButton();winbtnlist。setBounds(len,5,16,16);winbtnlist。setIcon(newImageIcon(iconwinbtnlist。png));winbtnlist。setActionCommand(listOff);add(winbtnlist);winbtnvolumenewDIYButton();winbtnvolume。setBounds(len180,5,16,16);winbtnvolume。setIcon(newImageIcon(iconwinbtnvolumeOn。png));winbtnvolume。setActionCommand(volumeOn);add(winbtnvolume);volumenewVolume();volume。setBounds(len200,12,100,3);add(volume);volumeSlidernewJSlider(0,100,0);volumeSlider。setValue(20);设置默认音量100volumeSlider。setBounds(len200,3,100,24);volumeSlider。setUI(newSliderStyle(volumeSlider));volumeSlider。setBackground(newColor(125,125,125));volumeSlider。setCursor(Cursor。getPredefinedCursor(Cursor。HANDCURSOR));add(volumeSlider);setBackground(Color。gray);setLayout(null);}publicvoidactionPerformed(ActionEvente){TODOAutogeneratedmethodstub}}
效果: