返回顶部

收藏

带图标和缩略图的列表框JList

更多

带图标和缩略图的列表框JList

public class PolymorphicJList extends JList {

    static Color listForeground, listBackground,
        listSelectionForeground, listSelectionBackground; 
    static {        
        UIDefaults uid = UIManager.getLookAndFeel().getDefaults(); 
        listForeground = uid.getColor ("List.foreground"); 
        listBackground = uid.getColor ("List.background"); 
        listSelectionForeground = uid.getColor ("List.selectionForeground"); 
        listSelectionBackground = uid.getColor ("List.selectionBackground");
    }
ImageIcon fileIcon, textFileIcon, directoryIcon,
            imageFileIcon, pngFileIcon, gifFileIcon,
            jpegFileIcon;
        JComponent fileCellPrototype, textCellPrototype,
            imageCellPrototype, directoryCellPrototype;
        JLabel fileNameLabel, textNameLabel,
            directoryNameLabel, imageNameLabel,
            fileSizeLabel,
            textSizeLabel, textWordCountLabel,
            directoryCountLabel,
            imageSizeLabel, imageIconLabel;

        public PolymorphicJList (File dir) {
            super();
            buildPrototypeCells();
            setCellRenderer (new PolyRenderer());
            setModel (new DefaultListModel());
            if (! dir.isDirectory())
                dir = new File (dir.getParent());
            buildModelFromDir (dir);
        }

        public static void main (String[] args) {
            File dir = new File (".");
            if (args.length > 0)
                dir = new File (args[0]);
            JList list = new PolymorphicJList (dir);
            JScrollPane pain =
                new JScrollPane (list, 
                                 ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, 
                                 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            JFrame frame = new JFrame ("PolymorphicJList");
            frame.getContentPane().add (pain);
            frame.pack();
            frame.setVisible(true);
        }

        protected void buildModelFromDir (File dir) {
            File[] files = dir.listFiles();
            DefaultListModel mod = (DefaultListModel) getModel();
            for (int i=0; i<files.length; i++) {
                if (isTextFile (files[i]))
                    mod.addElement (new TextFileItem (files[i]));
                else if (isImageFile (files [i]))
                    mod.addElement (new ImageFileItem (files[i]));
                else if (files[i].isDirectory())
                    mod.addElement (new DirectoryItem (files[i]));
else
                    mod.addElement (new FileItem (files[i]));
            }
       }

   protected boolean isImageFile(File f) {
            if (f.isDirectory())
                return false;        
            String name = f.getName(); 
            return name.endsWith (".gif") || name.endsWith (".GIF") ||
               name.endsWith (".jpg") || name.endsWith (".JPG") || 
               name.endsWith (".jpeg") || name.endsWith (".JPEG") || 
               name.endsWith (".bmp") || name.endsWith (".BMP") || 
               name.endsWith (".png") || name.endsWith (".PNG");
        }

        protected boolean isTextFile(File f) {
            if (f.isDirectory())
                return false;        
            String name = f.getName(); 
            return name.endsWith (".txt") || name.endsWith (".html") ||
               name.endsWith (".xml") || name.endsWith (".xhtml") ||                
               name.endsWith (".java") || name.endsWith (".c") || 
               name.endsWith (".cpp") || name.endsWith (".c++") || 
               name.endsWith (".m") || name.endsWith (".h");
        }

        protected void buildIcons() {
            String SEP = System.getProperty ("file.separator");
            fileIcon = new ImageIcon ("images" + SEP + "generic.gif");
            textFileIcon = new ImageIcon ("images" + SEP + "text.gif");
            directoryIcon = new ImageIcon ("images" + SEP + "folder.gif");
            imageFileIcon = new ImageIcon ("images" + SEP + "image.gif");
            pngFileIcon = new ImageIcon ("images" + SEP + "png.gif");
            gifFileIcon = new ImageIcon ("images" + SEP + "gif.gif");
            jpegFileIcon = new ImageIcon ("images" + SEP + "jpeg.gif");

        }

        protected void buildPrototypeCells() {
            buildIcons();
            fileCellPrototype = new JPanel();
            fileCellPrototype.setLayout (new GridBagLayout());
            addWithGridBag (new JLabel(fileIcon), fileCellPrototype,
                            0, 0, 1, 2, 
                            GridBagConstraints.WEST, 
                            GridBagConstraints.BOTH, 0, 0);
            fileNameLabel = new JLabel();
            Font defaultLabelFont = fileNameLabel.getFont();
            Font nameFont =
                defaultLabelFont.deriveFont (Font.BOLD,
                                             defaultLabelFont.getSize()+2); 
            fileNameLabel.setFont (nameFont); 
            addWithGridBag (fileNameLabel, fileCellPrototype,
                            1, 0, 1, 1, 
                            GridBagConstraints.NORTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);       fileSizeLabel = new JLabel();
            addWithGridBag (fileSizeLabel, fileCellPrototype, 
                            1, 1, 1, 1, 
                            GridBagConstraints.SOUTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            opacify (fileCellPrototype);
            // text file
            textCellPrototype = new JPanel();
            textCellPrototype.setLayout (new GridBagLayout());
            addWithGridBag (new JLabel(textFileIcon), textCellPrototype,
                            0, 0, 1, 2, 
                            GridBagConstraints.WEST, 
                            GridBagConstraints.BOTH, 0, 0);
            textNameLabel = new JLabel();
            textNameLabel.setFont (nameFont);
            addWithGridBag (textNameLabel, textCellPrototype,
                            1, 0, 2, 1, 
                            GridBagConstraints.NORTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            textSizeLabel = new JLabel();
            textWordCountLabel = new JLabel();
            addWithGridBag (textSizeLabel, textCellPrototype,
                            1, 1, 1, 1, 
                            GridBagConstraints.NORTH, 
                            GridBagConstraints.HORIZONTAL, 0, 0);
            addWithGridBag (textWordCountLabel, textCellPrototype, 
                            2, 1, 1, 1, 
                            GridBagConstraints.SOUTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);

            opacify (textCellPrototype);
            // directory
            directoryCellPrototype = new JPanel();
            directoryCellPrototype.setLayout (new GridBagLayout());
            addWithGridBag (new JLabel(directoryIcon), directoryCellPrototype,
                            0, 0, 1, 2, 
                            GridBagConstraints.WEST, 
                            GridBagConstraints.BOTH, 0, 0);
            directoryNameLabel = new JLabel();
            directoryNameLabel.setFont (nameFont);
            addWithGridBag (directoryNameLabel, directoryCellPrototype,
                            1, 0, 1, 1, 
                            GridBagConstraints.NORTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            directoryCountLabel = new JLabel();
            addWithGridBag (directoryCountLabel, directoryCellPrototype, 
                            1, 1, 1, 1, 
                            GridBagConstraints.SOUTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            opacify (directoryCellPrototype);
   // image
            imageCellPrototype = new JPanel();
            imageCellPrototype.setLayout (new GridBagLayout());
            addWithGridBag (new JLabel(imageFileIcon), imageCellPrototype,
                            0, 0, 1, 2, 
                            GridBagConstraints.WEST, 
                            GridBagConstraints.BOTH, 0, 0);
            imageNameLabel = new JLabel();
            imageNameLabel.setFont (nameFont);
            addWithGridBag (imageNameLabel, imageCellPrototype,
                            1, 0, 1, 1, 
                            GridBagConstraints.NORTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            imageSizeLabel = new JLabel();
            addWithGridBag (imageSizeLabel, imageCellPrototype, 
                            1, 1, 1, 1, 
                            GridBagConstraints.SOUTH, 
                            GridBagConstraints.HORIZONTAL, 1, 0);
            imageIconLabel = new JLabel();
            addWithGridBag (imageIconLabel, imageCellPrototype,
                            2, 0, 1, 2,
                            GridBagConstraints.EAST,
                            GridBagConstraints.VERTICAL, 0, 0);
            opacify (imageCellPrototype);
}

private void addWithGridBag (Component comp, Container cont,
                             int x, int y,
                             int width, int height,
                             int anchor, int fill,
                             int weightx, int weighty) {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = x;
            gbc.gridy = y;
            gbc.gridwidth = width;
            gbc.gridheight = height;
            gbc.anchor = anchor;
            gbc.fill = fill;
            gbc.weightx = weightx;
            gbc.weighty = weighty;
            cont.add (comp, gbc);

       }

       private void opacify (Container prototype) {
           Component[] comps = prototype.getComponents();
           for (int i=0; i<comps.length; i++) {
                if (comps[i] instanceof JComponent)
                    ((JComponent)comps[i]).setOpaque(true);
       }
    }
class FileItem extends Object { 
   File file; 
   public FileItem (File f) {
       file = f; 
   } 
}

class ImageFileItem extends FileItem { 
   ImageIcon icon; 
   public ImageFileItem (File f) {
       super(f);
       initIcon();
   }
   void initIcon() {
       icon = new ImageIcon (file.getPath());
       // scale to 32 pix in largest dimension
       Image img = icon.getImage();
       float factor = 1.0f;
       if (img.getWidth(null) > img.getHeight(null))
           factor = Math.min (32f / img.getWidth(null), 1.0f);
 else
          factor = Math.min (32f / img.getHeight(null), 1.0f);
       Image scaledImage =
           img.getScaledInstance ((int) (img.getWidth(null) * factor), 
                                  (int) (img.getHeight(null) * factor), 
                                  Image.SCALE_FAST);
       icon.setImage(scaledImage); 
   } 
}

class DirectoryItem extends FileItem { 
    int childCount; 
    public DirectoryItem (File f) {
        super(f);
        initChildCount();
    }
    public int getChildCount() { return childCount; }
    void initChildCount () {
        if (! file.isDirectory()) 
            childCount = -1; 
        else            
           childCount = file.listFiles().length;        
        System.out.println (file.getPath() + ": " + childCount + " items"); 
    } 
}

class TextFileItem extends FileItem { 
    int wordCount = -1; 
    public TextFileItem (File f) {
        super(f);
        initWordCount();
    }
    public int getWordCount() { return wordCount; }
    protected void initWordCount() {
        try {
            StreamTokenizer izer =
                new StreamTokenizer (new BufferedReader
                    (new FileReader(file)));
            while (izer.nextToken() != StreamTokenizer.TT_EOF)
                wordCount++;
        } catch (Exception e) {
            e.printStackTrace();
            wordCount = -1;
        }        
        System.out.println (file.getPath() + ": " + wordCount + " words"); 
        } 
}
class PolyRenderer extends Object 
    implements ListCellRenderer {

    public Component getListCellRendererComponent(JList list,
                                                  Object value,
                                                  int index,
                                                  boolean isSelected,
                                                  boolean cellHasFocus) {

        if (value instanceof DirectoryItem) { 
            DirectoryItem item = (DirectoryItem) value;            
            directoryNameLabel.setText (item.file.getName());
            directoryCountLabel.setText (item.getChildCount() + " items"); 
            setColorsForSelectionState (directoryCellPrototype, isSelected); 
            return directoryCellPrototype;
        } else if (value instanceof TextFileItem) { 
            TextFileItem item = (TextFileItem) value; 
            // populate values            
            textNameLabel.setText (item.file.getName());            
            textSizeLabel.setText (item.file.length() + " bytes  ");
            textWordCountLabel.setText (item.getWordCount() + " words"); 
            setColorsForSelectionState (textCellPrototype, isSelected); 
            return textCellPrototype;
        } else if (value instanceof ImageFileItem) { 
            ImageFileItem item = (ImageFileItem) value; 
            // pouplate values            
            imageNameLabel.setText (item.file.getName());
           imageSizeLabel.setText (item.file.length() + " bytes");
           imageIconLabel.setIcon (item.icon); 
            setColorsForSelectionState (imageCellPrototype, isSelected); 
            return imageCellPrototype;
        } else { 
            FileItem item = (FileItem) value; 
            // pouplate values            
            fileNameLabel.setText (item.file.getName());            
            fileSizeLabel.setText (item.file.length() + " bytes"); 
            setColorsForSelectionState (fileCellPrototype, isSelected); 
            return fileCellPrototype;
        }
}
private void setColorsForSelectionState (Container prototype,
                                         boolean isSelected) {

   Component[] comps = prototype.getComponents();
            for (int i=0; i<comps.length; i++) {
                 if (isSelected) { 
                     comps[i].setForeground (listSelectionForeground); 
                     comps[i].setBackground (listSelectionBackground);
                 } else {
                     comps[i].setForeground (listForeground);
                     comps[i].setBackground (listBackground);

                 } 
             } 
          } 
       }
}

标签:java,Swing

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. 炒饭 发表 2015-05-23 03:51:23 让Java Swing使用系统默认主题
  2. viviworld 发表 2014-12-15 08:17:42 为什么糟糕的软件成功了
  3. 朴人博客 发表 2012-10-18 15:12:07 Java GUI编程中有关swing组件的阻塞
  4. 炒饭 发表 2015-05-23 03:51:23 让Java Swing使用系统默认主题
  5. aGuegu 发表 2013-03-21 11:10:10 [macro|Java] 3D8S光立方 + TF卡(视频)
  6. 炒饭 发表 2015-05-23 03:51:23 让Java Swing使用系统默认主题
  7. E-Van 发表 2012-07-28 03:28:54 javax.swing.JOptionPane.showMessageDialog()方法
  8. 炒饭 发表 2015-05-23 03:51:23 让Java Swing使用系统默认主题
  9. 博主 发表 2015-04-05 04:22:16 Java编程思想笔记五
  10. xiaoli.wang 发表 2018-07-15 13:31:41 基于Btrace的监控调试
  11. admin 发表 2009-03-24 08:39:21 java如何获取ResultSet记录行数
  12. crossoverJie 发表 2018-07-20 12:38:47 Guava 源码分析(Cache 原理【二阶段】)

发表评论