📄 util.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package com.hadeslee.yoyoplayer.util;import com.hadeslee.yoyoplayer.lyric.*;import com.hadeslee.yoyoplayer.playlist.PlayListItem;import com.hadeslee.yoyoplayer.setting.OptionDialog;import com.hadeslee.yoyoplayer.setting.SettingPanel;import com.sun.jna.examples.WindowUtils;import java.awt.Color;import java.awt.Cursor;import java.awt.Desktop;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.URL;import java.net.URLEncoder;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;import java.util.Properties;import java.util.logging.Level;import java.util.logging.Logger;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import javax.swing.ButtonGroup;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBoxMenuItem;import javax.swing.JDialog;import javax.swing.JFileChooser;import javax.swing.JMenu;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPopupMenu;import javax.swing.JRadioButtonMenuItem;import javax.swing.JToggleButton;import javax.swing.event.ChangeListener;import org.apache.commons.httpclient.Header;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.URI;import org.apache.commons.httpclient.UsernamePasswordCredentials;import org.apache.commons.httpclient.auth.AuthScope;import org.apache.commons.httpclient.methods.GetMethod;/** * 一个工具类,主要负责分析歌词 * 并找到歌词下载下来,然后保存成标准格式的文件 * 还有一些常用的方法 * @author hadeslee */public final class Util { public static String VERSION = "1.1.3";//版本号,用于对比更新 private static Logger log = Logger.getLogger(Util.class.getName()); private static final JPanel panel = new JPanel(); private static final JFileChooser jfc = new JFileChooser(); private Util() { } /** * 检查更新新的一个很方便的方法, * 很多地方都可以调用到此方法,并且此方法 * 负责弹出对话框让用户选择或者其它一些实现 * @param ver 得到的版本对象 */ public static void checkUpdate(Version remote) { if (remote != null && remote.getVersion() != null) { if (Util.canUpdate(remote.getVersion())) { int i = JOptionPane.showConfirmDialog(null, Config.getResource("Util.currentVersion") + Util.VERSION + "\n" + Config.getResource("Util.remoteVersion") + remote.getVersion() + "\n" + Config.getResource("Util.versionDescription") + remote.getDescription() + Config.getResource("Util.areyouupdate"), Config.getResource("Util.hasUpdate"), JOptionPane.YES_NO_OPTION); if (i == JOptionPane.YES_OPTION) { try { Desktop.getDesktop().browse(new java.net.URI(remote.getUrl())); } catch (Exception ex) { Logger.getLogger(SettingPanel.class.getName()).log(Level.SEVERE, null, ex); } } } else { JOptionPane.showMessageDialog(null, Config.getResource("Util.currentVersion") + Util.VERSION + "\n" + Config.getResource("Util.remoteVersion") + remote.getVersion() + Config.getResource("Util.noUpdate")); } } } /** * 根据远程取到的版本和现在的版本对比 * 看能不能更新 * @param version 远程的版本 * @return 能不能更新 */ private static boolean canUpdate(String version) { if (version == null) { return false; } return VERSION.compareTo(version) < 0; } public static boolean voteOpen() { try { HttpClient http = new HttpClient(); http.getParams().setContentCharset("GBK"); GetMethod get = new GetMethod("http://www.blogjava.net/Files/hadeslee/voteOpen.zip"); get.addRequestHeader("Host", "www.blogjava.net"); get.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11"); get.addRequestHeader("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); get.addRequestHeader("Accept-Language", "zh-cn,zh;q=0.5"); get.addRequestHeader("Accept-Charset", "x-gbk,utf-8;q=0.7,*;q=0.7"); get.addRequestHeader("Connection", "keep-alive"); get.addRequestHeader("Referer", "http://www.blogjava.net/hadeslee"); int i = http.executeMethod(get); get.releaseConnection(); return true; } catch (IOException ex) { return false; } } public static boolean voteOneHour() { try { HttpClient http = new HttpClient(); http.getParams().setContentCharset("GBK"); GetMethod get = new GetMethod("http://www.blogjava.net/Files/hadeslee/voteOneHour.zip"); get.addRequestHeader("Host", "www.blogjava.net"); get.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11"); get.addRequestHeader("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); get.addRequestHeader("Accept-Language", "zh-cn,zh;q=0.5"); get.addRequestHeader("Accept-Charset", "x-gbk,utf-8;q=0.7,*;q=0.7"); get.addRequestHeader("Connection", "keep-alive"); get.addRequestHeader("Referer", "http://www.blogjava.net/hadeslee"); int i = http.executeMethod(get); get.releaseConnection(); return true; } catch (IOException ex) { return false; } } /** * 得到远程的版本的方法,返回一个字符串, * 格式为x.x.x然后再用方法做为比较 * 版本的信息从哪里取的问题,一般版本的信息URL * 也是写在本类里面,因为所有的程序中,最有可能更新的就是 * 本类,因为本类搜索歌词的代码可能会要改动 * 因为可能网站会变化 * @return 远程的版本对象 */ public static Version getRemoteVersion() { try { HttpClient http = new HttpClient(); http.getParams().setContentCharset("GBK"); GetMethod get = new GetMethod("http://www.blogjava.net/Files/hadeslee/version.zip"); get.addRequestHeader("Host", "www.blogjava.net"); get.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11"); get.addRequestHeader("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); get.addRequestHeader("Accept-Language", "zh-cn,zh;q=0.5"); get.addRequestHeader("Accept-Charset", "x-gbk,utf-8;q=0.7,*;q=0.7"); get.addRequestHeader("Connection", "keep-alive"); get.addRequestHeader("Referer", "http://www.blogjava.net/hadeslee"); int i = http.executeMethod(get); ZipInputStream zip = new ZipInputStream(get.getResponseBodyAsStream()); ZipEntry entry = zip.getNextEntry(); Properties pro = new Properties(); pro.load(zip); String version = pro.getProperty("Version"); String url = pro.getProperty("URL"); String des = pro.getProperty("Description"); log.log(Level.INFO, "RemoteVersion=" + version); get.releaseConnection(); return new Version(version, url, des); } catch (IOException ex) { Logger.getLogger(Util.class.getName()).log(Level.SEVERE, null, ex); return null; } } /** * 一个简便的生成一系列渐变颜色的方法,一般是生成128 * 个颜个,供可视化窗口用 * @param c1 第一种颜色 * @param c2 第二种颜色 * @param c3 第三种颜色 * @param count 生成几种颜色 * @return 渐变色 */ public static Color[] getColors(Color c1, Color c2, Color c3, int count) { Color[] cs = new Color[count]; int half = count / 2; float addR = (c2.getRed() - c1.getRed()) * 1.0f / half; float addG = (c2.getGreen() - c1.getGreen()) * 1.0f / half; float addB = (c2.getBlue() - c1.getBlue()) * 1.0f / half;// log.log(Level.INFO, "addR="+addR+",addG="+addG+",addB="+addB); int r = c1.getRed(); int g = c1.getGreen(); int b = c1.getBlue(); for (int i = 0; i < half; i++) { cs[i] = new Color((int) (r + i * addR), (int) (g + i * addG), (int) (b + i * addB));// log.log(Level.INFO, "cs["+i+"]="+cs[i]); } addR = (c3.getRed() - c2.getRed()) * 1.0f / half; addG = (c3.getGreen() - c2.getGreen()) * 1.0f / half; addB = (c3.getBlue() - c2.getBlue()) * 1.0f / half; r = c2.getRed(); g = c2.getGreen(); b = c2.getBlue(); for (int i = half; i < count; i++) { cs[i] = new Color((int) (r + (i - half) * addR), (int) (g + (i - half) * addG), (int) (b + (i - half) * addB));// log.log(Level.INFO, "cs["+i+"]="+cs[i]); } return cs; } /** * 根据特定的颜色生成一个图标的方法 * @param c 颜色 * @param width 宽度 * @param height 高度 * @return 图标 */ public static ImageIcon createColorIcon(Color c, int width, int height) { BufferedImage bi = createImage(c, width, height); return new ImageIcon(bi); } /** * 根据特定的颜色,生成这个颜色的一张图片 * 一般用于显示在图片按钮上做为ICON的 * @param c 颜色 * @param width 图片的宽度 * @param height 图片的高度 * @return 生成的图片 */ public static BufferedImage createImage(Color c, int width, int height) { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); g.setColor(c); g.fillRect(0, 0, width, height); g.setColor(new Color(128, 128, 128)); g.drawRect(0, 0, width - 1, height - 1); g.setColor(new Color(236, 233, 216)); g.drawRect(1, 1, width - 3, height - 3); return bi; } /** * 快速地生成歌词秀上下文菜单的方法 * @param pop 菜单 * @param lp 歌词面板 */ public static void generateLyricMenu(JMenu pop, final LyricPanel lp) { final Config config = Config.getConfig(); JMenu adjust = new JMenu(Config.getResource("Util.adjustLyric")); JMenu showType = new JMenu(Config.getResource("Util.displayMode"));// JMenu set = new JMenu("设置"); adjust.add(Config.getResource("Util.ff0.5")).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lp.getLyric().adjustTime(-500); } }); adjust.add(Config.getResource("Util.ss0.5")).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { lp.getLyric().adjustTime(500); } }); adjust.add(Config.getResource("Util.adjustAll")).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String s = JOptionPane.showInputDialog(Config.getResource("Util.inputAdjustTime") + Config.getResource("Util.adjustTip")); if (s != null) { try { int time = Integer.parseInt(s); lp.getLyric().adjustTime(time); } catch (Exception exe) { } } } }); adjust.addSeparator(); final JCheckBoxMenuItem check = new JCheckBoxMenuItem(Config.getResource("Util.mouseWheelAdjust")); check.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { config.setMouseScrollAjustTime(check.isSelected()); } }); check.setSelected(config.isMouseScrollAjustTime()); adjust.add(check); pop.add(Config.getResource("lyric.hideLyric")).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { lp.hideMe(); } }); pop.add(Config.getResource("Util.searchOnline")).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { new WebSearchDialog(lp.getPlayer().getCurrentItem(), lp).setVisible(true); } });
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -