JList实现随意切换歌曲、更新线程以及问题分析

   如果在JList中添加一个ListSelectionListener,在监听到动作之后进行播放音乐。如果在播放过程中进行歌曲切换,那么先前进行播放的进程无法关闭,会造成多个播放进程同时运行。

   如何解决这个问题呢? 解决方法如下:  

public String listener(JButton b1, JButton b2, JButton b3) {

		list.addListSelectionListener(new ListSelectionListener() {

			@Override
			public void valueChanged(ListSelectionEvent e) {
				// TODO Auto-generated method stub
				flag = flag + 1; // 俩次点击解决

				if ((flag % 2) == 0) { // 监听到俩次
					str = (String) list.getSelectedValue();
					/** 调用播放音乐的类并传入播放音乐名称 **/
					playMusic p = new playMusic(str);
					try {
						p.getConnection();
					} catch (NoPlayerException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
					p.start();

					// System.out.println("播放: "+str);
					list.addListSelectionListener(new ListSelectionListener() {

						@Override
						public void valueChanged(ListSelectionEvent e) {
							// TODO Auto-generated method stub
							if ((flag % 2) == 0) { // 尽量减少重复的操作
								p.close();
							}
						}
					});

					b1.addActionListener(new ActionListener() {

						@Override
						public void actionPerformed(ActionEvent arg0) {
							// TODO Auto-generated method stub
							p.start();
						}
					});

					b2.addActionListener(new ActionListener() {

						@Override
						public void actionPerformed(ActionEvent arg0) {
							// TODO Auto-generated method stub
                               p.stop();
						}
					});

					b3.addActionListener(new ActionListener() {

						@Override
						public void actionPerformed(ActionEvent arg0) {
							// TODO Auto-generated method stub
                        p.close();
						}
					});
				}

			}
		});
		return str;

	}

     解决方法的原理是:对一个事件构造多个监听器。(俩个,内嵌入一个JList监听器)

     监听流程:第一次点击List对象,运行播放;第二次,点击List对象,执行第一次监听器中的内嵌监听对象的内容,因为在同一个代码块中(监听器),线程对象未变,此时关闭上次播放的播放线程对象。同时又会出现一个新的内嵌监听对象(俩个监听器),但是前面的内嵌监听器(俩个监听器的第二个监听器)并不会消失,因此p.close()操作会被执行俩次,而后每点击一次JList对象增加一个内嵌监听器,p.close()多执行一次,不断叠加。但是,前面的第二个监听器中的p线程是消亡的,故此有效的p.close()只有执行一次,为最新生成的内嵌监听器里面的p.close()。

     

猜你喜欢

转载自blog.csdn.net/qq_37334150/article/details/80286510