📄 playlistui.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.hadeslee.yoyoplayer.playlist;import com.hadeslee.yoyoplayer.util.MultiImageBorder;import com.hadeslee.yoyoplayer.player.ui.PlayerUI;import com.hadeslee.yoyoplayer.tag.SongInfoDialog;import com.hadeslee.yoyoplayer.util.Config;import com.hadeslee.yoyoplayer.util.FileNameFilter;import com.hadeslee.yoyoplayer.util.Util;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.Transferable;import java.awt.datatransfer.UnsupportedFlavorException;import java.awt.dnd.DnDConstants;import java.awt.dnd.DragGestureEvent;import java.awt.dnd.DragGestureListener;import java.awt.dnd.DragSource;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.AdjustmentEvent;import java.awt.event.AdjustmentListener;import java.awt.event.InputEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import java.io.File;import java.io.IOException;import java.net.URI;import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Locale;import java.util.Vector;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.ButtonGroup;import javax.swing.DropMode;import javax.swing.JFileChooser;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JMenu;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPopupMenu;import javax.swing.JRadioButtonMenuItem;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.ListCellRenderer;import javax.swing.SwingConstants;import javax.swing.TransferHandler;import javax.swing.border.EmptyBorder;import javax.swing.plaf.basic.BasicScrollBarUI;/** * * @author hadeslee */@SuppressWarnings("unchecked")public class PlayListUI extends JPanel implements ActionListener, MouseListener, MouseMotionListener { private static final long serialVersionUID = 20071214L; private static Logger log = Logger.getLogger(PlayListUI.class.getName()); private PlayListItem currentItem;//当前的列表项 private PlayList currentPlayList;//当前所使用的播放列表 private PlayerUI player;//播放器的主UI界面兼播放器 private JList leftList, rightList;//左边和右边的列表 private JSplitPane split;//一个分隔栏 private Config config;//全局配置对象 private final DataFlavor flavor = new DataFlavor(MyData.class, "内部数据"); private Vector<PlayList> playlists;//所有的播放列表 private static final Color BG = new Color(6, 6, 6); private static final Color FORE = new Color(100, 100, 100); private static final Color HILIGHT = new Color(0, 244, 245); private int rightIndex = -1;//右边选中的下标,用于内部拖放用的 private int leftIndex = -1;//左边选中的下标 private int onIndex = -1;//目前鼠标在哪个下标的上面,如果下一个一样的话,就不用再设tooltip了 private boolean rightHasFocus;//指示右边的列表该不该有焦点 private List<PlayListItem> clip;//复制在粘帖板里面的数据 public PlayListUI() { super(new BorderLayout()); clip = new ArrayList<PlayListItem>(); this.setMinimumSize(new Dimension(285, 100)); this.setPreferredSize(new Dimension(285, 155)); this.setBackground(Config.getConfig().getPlaylistBackground1());// this.setBackground(Color.RED); } public void setPlayerUI(PlayerUI player) { this.player = player; } /** * 设置当前正在播放的项, * @param item */ public void setCurrentItem(PlayListItem item) { this.currentItem = item; rightList.setSelectedValue(item, true); rightList.clearSelection(); } public void loadUI(Component parent, Config config) { this.config = config; playlists = config.getPlayLists(); if (playlists.size() == 0) { currentPlayList = new BasicPlayList(config); currentPlayList.setName(Config.getResource("playlistL.PreNEW") + 1); playlists.add(currentPlayList); } else { //找到关闭的时候使用的列表以及放的歌曲,如有必要,自动播放 String current = config.getCurrentPlayListName(); if (current != null) { boolean find = false; for (PlayList pl : playlists) { if (pl.getName().equals(current)) { currentPlayList = pl; find = true; break; } } if (find == false) { currentPlayList = playlists.get(0); } } else { currentPlayList = playlists.get(0); } } player.setPlayList(currentPlayList); MultiImageBorder border = new MultiImageBorder(parent, config); border.setCorner1(Util.getImage("playlist/corner1.png")); border.setCorner2(Util.getImage("playlist/corner2.png")); border.setCorner3(Util.getImage("playlist/corner3.png")); border.setCorner4(Util.getImage("playlist/corner4.png")); border.setTop(Util.getImage("playlist/top.png")); border.setBottom(Util.getImage("playlist/bottom.png")); border.setLeft(Util.getImage("playlist/left.png")); border.setRight(Util.getImage("playlist/right.png")); this.setBorder(border); this.addMouseListener(border); this.addMouseMotionListener(border); initUI(); } private void initUI() { leftList = new JList(); rightList = new JList(); leftList.setBackground(BG); rightList.setBackground(BG); leftList.setListData(playlists); leftList.setCellRenderer(new LeftListCellRenderer()); rightList.setListData(currentPlayList.getAllItems()); rightList.setCellRenderer(new RightListCellRenderer()); leftList.addMouseListener(this); rightList.addMouseListener(this); rightList.addMouseMotionListener(this); JScrollPane jsp1 = new JScrollPane(leftList); JScrollPane jsp2 = new JScrollPane(rightList);// jsp1.setBorder(new EmptyBorder(0, 0, 0, 0));// jsp2.setBorder(new EmptyBorder(0, 0, 0, 0)); BasicScrollBarUI yoyo1 = new YOYOScrollBarUI(); BasicScrollBarUI yoyo2 = new YOYOScrollBarUI(); jsp1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jsp2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jsp2.getVerticalScrollBar().setUI(yoyo1); jsp1.getVerticalScrollBar().setUI(yoyo2); jsp2.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { public void adjustmentValueChanged(AdjustmentEvent e) { if (!config.getReadTagInfoStrategy().equals(Config.READ_WHEN_DISPLAY)) { return; } int from = rightList.getFirstVisibleIndex(); int to = rightList.getLastVisibleIndex(); if (from == -1 || to == -1) { return; } for (int i = from; i <= to; i++) { currentPlayList.getItemAt(i).getTagInfo(); } } }); split = new JSplitPane(SwingConstants.VERTICAL, true, jsp1, jsp2); split.setBorder(new EmptyBorder(0, 0, 0, 0)); this.add(split); initDragList(); split.setDividerLocation(60); //添加键盘事件,以可以用键盘直接删除列表项 rightList.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent ke) { if (rightIndex != -1 && rightIndex < currentPlayList.getPlaylistSize()) { if (ke.getKeyCode() == KeyEvent.VK_DELETE) { currentPlayList.removeItemAt(rightIndex); rightList.setListData(currentPlayList.getAllItems()); if (rightIndex > currentPlayList.getPlaylistSize() - 1) { rightIndex = 0; } if (currentPlayList.getPlaylistSize() == 0) { return; } rightList.setSelectedValue(currentPlayList.getItemAt(rightIndex), rightHasFocus); } } } }); } /** * 初始化拖动列表内部数据 */ private void initDragList() { DragSource ds = DragSource.getDefaultDragSource(); ds.createDefaultDragGestureRecognizer(rightList, DnDConstants.ACTION_COPY_OR_MOVE, new DragGestureListener() { public void dragGestureRecognized(DragGestureEvent dge) { dge.startDrag(DragSource.DefaultCopyDrop, new Transferable() { public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{flavor}; } public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(flavor); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { if (rightIndex == -1) { return null; } MyData<PlayListItem> my = new MyData<PlayListItem>(rightIndex, currentPlayList.getItemAt(rightIndex)); return my; } else { throw new UnsupportedFlavorException(flavor); } } }); } }); rightList.setTransferHandler(new TransferHandler() { private static final long serialVersionUID = 20071214L; @Override public boolean canImport(TransferSupport support) { if (!config.isCanDnD()) { return false; } String os = System.getProperty("os.name"); if (os.startsWith("Windows")) { return (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) || support.isDataFlavorSupported(flavor)); } else if (os.startsWith("Linux")) { return support.isDataFlavorSupported(DataFlavor.stringFlavor) || support.isDataFlavorSupported(flavor); } else { return super.canImport(support); } } @Override public boolean importData(TransferSupport support) { try { if (!canImport(support)) { return false; } Object toSelect = null; int index = 0; try { JList.DropLocation location = (JList.DropLocation) support.getDropLocation(); index = location.getIndex(); } catch (Exception exe) { exe.printStackTrace(); } if (index < 0) { log.log(Level.SEVERE, "拖放点的index出现了小于0的情况!!"); index = 0; } Transferable trans = support.getTransferable(); Object obj = null; if (trans.isDataFlavorSupported(flavor)) { obj = trans.getTransferData(flavor); if (obj == null) { return false; } MyData<PlayListItem> my = (MyData<PlayListItem>) obj; currentPlayList.addItemAt(my.getData(), index); if (index < my.getOldIndex()) { currentPlayList.removeItemAt(my.getOldIndex() + 1); } else { currentPlayList.removeItemAt(my.getOldIndex()); } toSelect = my.getData(); } else if (trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { obj = trans.getTransferData(DataFlavor.javaFileListFlavor); List<File> s = (List<File>) obj; FileNameFilter ff = new FileNameFilter(Config.EXTS, Config.getResource("playlist.filechooser.name"), false); for (File f : s) { if (f.exists()) { //如果是文件,则检查其后缀名 if (f.isFile() && ff.accept(f)) { PlayListItem item = new PlayListItem(Util.getSongName(f), f.getPath(), -1, true); currentPlayList.addItemAt(item, index); toSelect = item; //如果是目录,则遍历它下面的文件,不再往下层遍历了 } else if (f.isDirectory()) { File[] fs = f.listFiles(ff); for (File file : fs) { PlayListItem item = new PlayListItem(Util.getSongName(file), file.getPath(), -1, true); currentPlayList.addItemAt(item, index); toSelect = item; } } } } } else if (trans.isDataFlavorSupported(DataFlavor.stringFlavor) && System.getProperty("os.name").startsWith("Linux")) { obj = trans.getTransferData(DataFlavor.stringFlavor); log.info("得到的内容是:" + obj); String[] ss = obj.toString().split("\r\n"); FileNameFilter ff = new FileNameFilter(Config.EXTS, Config.getResource("playlist.filechooser.name"), false); for (String s : ss) { try { File f = new File(new URI(s)); if (f.exists()) { //如果是文件,则检查其后缀名 //现在不用检查了,错了也不要紧 if (f.isFile() && ff.accept(f)) { PlayListItem item = new PlayListItem(Util.getSongName(f), f.getPath(), -1, true); currentPlayList.addItemAt(item, index); toSelect = item; //如果是目录,则遍历它下面的文件,不再往下层遍历了 } else if (f.isDirectory()) { File[] fs = f.listFiles(ff); for (File file : fs) { PlayListItem item = new PlayListItem(Util.getSongName(file), file.getPath(), -1, true); currentPlayList.addItemAt(item, index); toSelect = item; } } } } catch (Exception exe) { exe.printStackTrace();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -