/** * */ package client; /** * @author Administrator * */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.border.Border; import javax.swing.border.LineBorder; public class Expression extends JDialog { @SuppressWarnings("serial") class MyLabel extends JLabel { String name; MyLabel(BufferedImage icon, String name) { setBorder(new LineBorder(getBackground())); this.name = name; this.setIcon(new ImageIcon(icon)); addMouseListener(ml); } } class MyListener implements MouseListener { public void mouseClicked(MouseEvent e) { MyLabel ml = (MyLabel) e.getComponent(); System.out.print(ml.name); } public void mouseEntered(MouseEvent e) { setborder(e); } public void mouseExited(MouseEvent e) { removeborder(e); } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } private void removeborder(MouseEvent e) { MyLabel ml = (MyLabel) e.getComponent(); Border border = new LineBorder(getBackground()); ml.setBorder(border); } private void setborder(MouseEvent e) { MyLabel ml = (MyLabel) e.getComponent(); Border border = new LineBorder(new Color(0x0000ff)); ml.setBorder(border); } } private JTabbedPane jtp; private JPanel jp; private MyListener ml; private File[] parentfiles; /** * */ private static final long serialVersionUID = 1L; public static void main(String[] args) { new Expression(); } public static BufferedImage resize(BufferedImage source, int hw) { // targetW,targetH分别表示目标长和宽 int type = source.getType(); BufferedImage target = null; double sx = (double) hw / source.getWidth(); double sy = (double) hw / source.getHeight(); // 这里想实现在targetW,targetH范围内实现等比缩放。如果不需要等比缩放 // 则将下面的if else语句注释即可 if (sx > sy) { sx = sy; hw = (int) (sx * source.getWidth()); } else { sy = sx; hw = (int) (sy * source.getHeight()); } if (type == BufferedImage.TYPE_CUSTOM) { // handmade ColorModel cm = source.getColorModel(); WritableRaster raster = cm.createCompatibleWritableRaster(hw, hw); boolean alphaPremultiplied = cm.isAlphaPremultiplied(); target = new BufferedImage(cm, raster, alphaPremultiplied, null); } else { target = new BufferedImage(hw, hw, type); } Graphics2D g = target.createGraphics(); // smoother than exlax: g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy)); g.dispose(); return target; } public static void saveImageAsJpg(File fromFile, String saveToFileStr, int hw) throws Exception { BufferedImage srcImage; String imgType = "JPEG"; File saveFile = new File(saveToFileStr); srcImage = ImageIO.read(fromFile); srcImage = resize(srcImage, hw); ImageIO.write(srcImage, imgType, saveFile); } public Expression() { this.setUndecorated(true); jtp = new JTabbedPane(); ml = new MyListener(); File dir = new File("images/"); parentfiles = dir.listFiles(); /** 获取images文件夹下的所有文件,一个一个的显示出来 */ for (File f : parentfiles) { /** 选择出文件夹 */ if (f.isDirectory()) { File minidir = new File(f, "mini"); jp = new JPanel(); jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); jp.setName(f.getName()); try { if (!minidir.exists()) { /** 如果没有mini文件夹则创建一个。并生成缩略图 */ minidir.mkdir(); creatMini(f.listFiles()); } /** 把mini文件夹中的缩略图显示出来 */ showExpression(minidir.listFiles()); } catch (IOException e) { // TODO } /** 将此文件夹的图片添加到JPanel上后,将此显示在JTabbedPane上 */ jtp.add(jp); } } initGUI(); } private void creatMini(File[] files) { int k; for(File f:files){ String saveto = f.getName().toLowerCase(); if (saveto.endsWith(".gif") || saveto.endsWith(".png") || saveto.endsWith(".jpg") || saveto.endsWith(".jpeg")) { k = saveto.lastIndexOf('.'); saveto = saveto.substring(0, k) + ".jpg"; saveto = f.getParent() + "//mini//" + saveto; try { saveImageAsJpg(f, saveto, 25); } catch (Exception e) { e.printStackTrace(); } } } } private void initGUI() { add(jtp, BorderLayout.CENTER); pack(); setVisible(true); } private void showExpression(File[] files) throws IOException { int num = files.length; String name; JPanel tempP = new JPanel(); int k; int cnum = (int) Math.sqrt(num); for (int i = 0; i < num; i++) { if (i > 0 && i % cnum == 0) { jp.add(tempP); tempP = new JPanel(); } BufferedImage icon = ImageIO.read(files[i]); name = files[i].getName(); k = name.indexOf('.'); name = name.substring(0, k); tempP.add(new MyLabel(icon, name)); } jp.add(tempP); } }