2011-08-28 14 views
8

मैं एक क्षैतिज अनुक्रम में चित्रों की एक श्रृंखला (छवि के साथ जेपीनेल और शायद कुछ अन्य छोटे घटकों) को प्रदर्शित करने का एक तरीका ढूंढ रहा हूं।जावा सूची में चित्र खींचें और ड्रॉप करें

उपयोगकर्ता ड्रैग और ड्रॉप द्वारा छवियों के क्रम को पुनर्व्यवस्थित करने में सक्षम होना चाहिए। मैं यह कैसे कर सकता हूं? क्या कुछ कस्टम घटकों के साथ जेएलिस्ट है और डी & डी जाने का रास्ता है? कुछ मुद्दों के बारे में सोचने के लिए (घटकों को एक ही आयाम प्रदर्शन को बढ़ाते हुए मैंने सुना है)।

उत्तर

12

निम्न उदाहरण एक सूची में क्षैतिज चित्र दिखाने के और खींचें & बूंद का उपयोग उनका क्रम बदलने के लिए कैसे दिखाता है। यदि यह अंतरिक्ष से बाहर हो जाता है तो सूची क्षैतिज रूप से लपेटती है।

import javax.swing.*; 
import javax.swing.border.Border; 
import java.awt.*; 
import java.awt.datatransfer.DataFlavor; 
import java.awt.datatransfer.Transferable; 
import java.awt.datatransfer.UnsupportedFlavorException; 
import java.io.IOException; 
import java.io.Serializable; 

public class ImagePreviewListTest { 

    public static void main(String[] args) throws Exception { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     JFrame frame = new JFrame("Image panel"); 
     frame.setSize(800, 300); 
     frame.setLocationByPlatform(true); 
     JList imageList = createImageList(); 
     frame.getContentPane().add(new JScrollPane(imageList)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    private static JList createImageList() { 

     JList imageList = new JList(createModel()); 
     imageList.setCellRenderer(new ImageCellRenderer()); 
     imageList.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
     imageList.setVisibleRowCount(-1); 
     imageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     imageList.setFixedCellWidth(240); 
     imageList.setFixedCellHeight(120); 

     imageList.setDragEnabled(true); 
     imageList.setDropMode(DropMode.INSERT); 
     imageList.setTransferHandler(new ImageTransferHandler(imageList)); 

     return imageList; 
} 

    private static DefaultListModel createModel() { 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(new ColorIcon(Color.RED)); 
     model.addElement(new ColorIcon(Color.GREEN)); 
     model.addElement(new ColorIcon(Color.BLACK)); 
     model.addElement(new ColorIcon(Color.BLUE)); 
     model.addElement(new ColorIcon(Color.MAGENTA)); 
     model.addElement(new ColorIcon(Color.PINK)); 
     model.addElement(new ColorIcon(Color.YELLOW)); 
     model.addElement(new ColorIcon(Color.ORANGE)); 
     return model; 
    } 

    static class ImageTransferHandler extends TransferHandler { 

     private static final DataFlavor DATA_FLAVOUR = new DataFlavor(ColorIcon.class, "Images"); 

     private final JList previewList; 
     private boolean inDrag; 

     ImageTransferHandler(JList previewList) { 
      this.previewList = previewList; 
     } 

     public int getSourceActions(JComponent c) { 
      return TransferHandler.MOVE; 
     } 

     protected Transferable createTransferable(JComponent c) { 
      inDrag = true; 
      return new Transferable() { 
       public DataFlavor[] getTransferDataFlavors() { 
        return new DataFlavor[] {DATA_FLAVOUR}; 
       } 

       public boolean isDataFlavorSupported(DataFlavor flavor) { 
        return flavor.equals(DATA_FLAVOUR); 
       } 

       public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
        return previewList.getSelectedValue(); 
       } 
      }; 
     } 

     public boolean canImport(TransferSupport support) { 
      if (!inDrag || !support.isDataFlavorSupported(DATA_FLAVOUR)) { 
       return false; 
      } 

      JList.DropLocation dl = (JList.DropLocation)support.getDropLocation(); 
      if (dl.getIndex() == -1) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

     public boolean importData(TransferSupport support) { 
      if (!canImport(support)) { 
       return false; 
      } 

      Transferable transferable = support.getTransferable(); 
      try { 
       Object draggedImage = transferable.getTransferData(DATA_FLAVOUR); 

       JList.DropLocation dl = (JList.DropLocation)support.getDropLocation(); 
       DefaultListModel model = (DefaultListModel)previewList.getModel(); 
       int dropIndex = dl.getIndex(); 
       if (model.indexOf(draggedImage) < dropIndex) { 
        dropIndex--; 
       } 
       model.removeElement(draggedImage); 
       model.add(dropIndex, draggedImage); 
       return true; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 

     protected void exportDone(JComponent source, Transferable data, int action) { 
      super.exportDone(source, data, action); 
      inDrag = false; 
     } 
    } 

    static class ImageCellRenderer extends JPanel implements ListCellRenderer { 

     DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer(); 
     JLabel imageLabel = new JLabel(); 
     JLabel descriptionLabel = new JLabel(); 

     ImageCellRenderer() { 
      setLayout(new BorderLayout()); 
      Border emptyBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); 
      imageLabel.setBorder(emptyBorder); 
      descriptionLabel.setBorder(emptyBorder); 
      add(imageLabel, BorderLayout.CENTER); 
      add(descriptionLabel, BorderLayout.SOUTH); 
     } 

     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      defaultListCellRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      setBorder(defaultListCellRenderer.getBorder()); 
      setBackground(defaultListCellRenderer.getBackground()); 
      imageLabel.setIcon((Icon)value); 
      descriptionLabel.setText("Description"); 
      return this; 
     } 
    } 

    static class ColorIcon implements Icon, Serializable { 
     private Color color; 

     ColorIcon(Color color) { 
      this.color = color; 
     } 

     public void paintIcon(Component c, Graphics g, int x, int y) { 
      g.setColor(color); 
      g.fillRect(x, y, getIconWidth(), getIconHeight()); 
     } 

     public int getIconWidth() { 
      return 200; 
     } 

     public int getIconHeight() { 
      return 100; 
     } 

     public boolean equals(Object o) { 
      if (o == null || getClass() != o.getClass()) { 
       return false; 
      } 
      return color.equals(((ColorIcon)o).color); 
     } 

    } 
} 
+1

बस कोड की कोशिश की, यह बहुत अच्छा है! –

1

एक सूची मॉडल बनाएं जिसमें छवियां हों।

एक सूचीसेलरेंडर बनाएं जो उन्हें प्रदर्शित करता है और इसे सूची के प्रस्तुतकर्ता के रूप में सेट करता है। आप अपने रेंडरर में जेएलएबल का उपयोग कर सकते हैं ताकि छवि को सेट करना आसान हो।

ट्रांसफरहैंडलर बनाएं जो डेटाफ्लॉवर.इमेजफ्लॉवर को संभालने के बारे में जानता है। स्टैनिस्लाव द्वारा उद्धृत उदाहरण एक शुरुआत है।

सूची का स्थानांतरण सेट करें हैंडलर संपत्ति।

संबंधित मुद्दे