我现在在做一个项目,其功能是首先在一个JList里面显示图像,然后可能通过鼠标拖放可能将图片拖到另一个JList里面显示,这个功能如何实现,答案正确,我多给分

解决方案 »

  1.   

    JList通过设置JList的CellRender实现,注意往JList填充的是对应的Object,我这里是都实现了ListdispInterface接口的对象public class ListCellRenderWithIcon extends DefaultListCellRenderer{    @Override
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                   if(!(value instanceof ListdispInterface))
                     return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                   JLabel jl = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                   ListdispInterface ldi = (ListdispInterface) value;
                   jl.setIcon(new javax.swing.ImageIcon(getClass().getResource(ldi.getPicUrl())));
                   jl.setText(ldi.getDispname());
                   jl.setToolTipText(ldi.getTruename());
                   return jl;
                }
    }
    jList = new JList( new DefaultListModel()){
                ListCellRenderWithIcon lcr = new ListCellRenderWithIcon();
                @Override
                public ListCellRenderer getCellRenderer() {
                    return lcr;
                }
            };
    拖放首先要设置TransferHandlerimport java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.StringSelection;
    import java.awt.datatransfer.Transferable;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;import javax.swing.JComponent;
    import javax.swing.TransferHandler;public abstract class StringTransferHandler extends TransferHandler {
        
        protected abstract String exportString(JComponent c);
        protected abstract void importString(JComponent c, String str);
        protected abstract void cleanup(JComponent c, boolean remove);
        
        protected Transferable createTransferable(JComponent c) {
            return new StringSelection(exportString(c));
        }
        
        public int getSourceActions(JComponent c) {
            return COPY;
        }
        
        public boolean importData(JComponent c, Transferable t) {
            if (canImport(c, t.getTransferDataFlavors())) {
                try {
                    String str = (String)t.getTransferData(DataFlavor.stringFlavor);
                    importString(c, str);
                    return true;
                } catch (UnsupportedFlavorException ufe) {
                } catch (IOException ioe) {
                }
            }        return false;
        }
        
        protected void exportDone(JComponent c, Transferable data, int action) {
          //  cleanup(c, action == MOVE);
        }
        
        public boolean canImport(JComponent c, DataFlavor[] flavors) {
            for (int i = 0; i < flavors.length; i++) {
                if (DataFlavor.stringFlavor.equals(flavors[i])) {
                    return true;
                }
            }
            return false;
        }
    }
    上面那个是基础的TransferHandler,下面这个例子是我Table中的,修改下即可变成JList的,在exportString中按照自己定义的格式修改成String串(如果要图片就把图片URL附上),importString中按照那个String格式处理,canImport限制是否允许拖曳到
    package com.hsipcc.wfBuilder.util;import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.UnsupportedFlavorException;
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;public class TableRowTransferHandler extends StringTransferHandler
    { protected String exportString(JComponent c)
    {
    JTable jt = (JTable) c;
                    if(jt.getSelectedRow()!=-1 && jt.getSelectedColumn()!=-1)
                    {
                        return "tabrow:"+jt.getSelectedRow();
                    }
                   return "";
    } protected void importString(JComponent c, String str)
    {
    JTable jt = (JTable) c;
                   DefaultTableModel dtm = (DefaultTableModel) jt.getModel();
                    dtm.moveRow(Integer.parseInt(str.substring(7)), Integer.parseInt(str.substring(7)), jt.getSelectedRow());
    } protected void cleanup(JComponent c, boolean remove)
    {

    }
            public boolean canImport(TransferSupport support) {
                 String str;
            try {
                str = (String) (support.getTransferable().getTransferData(DataFlavor.stringFlavor));
                if (str.startsWith("tabrow:")) {
                    return true;
                }        } catch (UnsupportedFlavorException ex) {
                Logger.getLogger(TableRowTransferHandler.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(TableRowTransferHandler.class.getName()).log(Level.SEVERE, null, ex);
            }
                   return false;
            }
           
    }jList.setDragEnabled(true);//设置允许jList拖曳
    jList.setTransferHandler(new TableRowTransferHandler());//绑定TransferHandler