Перетащите изображение из браузера, чтобы перейти на JLabel - PullRequest
2 голосов
/ 07 января 2012

Я хочу иметь возможность устанавливать изображение на JLabel, когда оно сбрасывается, например, из веб-браузера.Я основал реализацию на Поддержка перетаскивания изображений .

@Override
public boolean importData(JComponent comp, Transferable t) {
    if (comp instanceof JLabel) {
        JLabel label = (JLabel) comp;
        if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
            try {
                image = (Image) t.getTransferData(DataFlavor.imageFlavor);
                ImageIcon icon = new ImageIcon(image);
                label.setIcon(icon);
                return true;
            } catch (Throwable th) {
                log.error("Failed to accept dropped image", th);
            }
        } else if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            try {
                @SuppressWarnings("unchecked")
                List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
                if (files.size() == 1) {
                        ImageIcon icon = new ImageIcon(files.get(0).getAbsolutePath());
                        label.setIcon(icon);
                }
                return true;
            } catch (Throwable th) {
                log.error("Failed to accept dropped image", th);
            }
        }
    }
    return false;
}

Для части DataFlavor.javaFileListFlavor все работает нормально, но с DataFlavor.imageFlavour полученное изображение всегдаnull и исключение NullPointerException создается при создании экземпляра ImageIcon.

Кто-то знает, почему это происходит?

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Ваш код выглядит нормально. Я протестировал его с помощью следующего кода, и перетаскивание изображения из моего веб-браузера (Google Chrome) на JPanel устанавливает изображение в JLabel.

import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.TransferHandler;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

public class DragAndDropTester {
  private static final JLabel TEST_LABEL = new JLabel( "TestLabel" );

  public static void main( String[] args ) {
    try {
      EventQueue.invokeAndWait( new Runnable() {
        public void run() {

          JFrame testFrame = new JFrame( "Test" );

          JPanel contents = new JPanel( new BorderLayout() );
          contents.add( TEST_LABEL, BorderLayout.CENTER );

          contents.setTransferHandler( createTransferHandler() );

          testFrame.getContentPane().add( contents );
          testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
          testFrame.setSize( 200, 200 );
          testFrame.setVisible( true );
        }
      } );
    } catch ( InterruptedException e ) {
    } catch ( InvocationTargetException e ) {
    }
  }

  private static TransferHandler createTransferHandler(){
    return new TransferHandler(  ){
      @Override
      public boolean importData( JComponent comp, Transferable aTransferable ) {
        try {
          Object transferData = aTransferable.getTransferData( DataFlavor.imageFlavor );
          TEST_LABEL.setIcon( new ImageIcon( ( Image ) transferData ) );
        } catch ( UnsupportedFlavorException e ) {
        } catch ( IOException e ) {
        }
        return true;
      }

      @Override
      public boolean canImport( JComponent comp, DataFlavor[] transferFlavors ) {
        return true;
      }
    };
  }
}

Это было проверено на моем Mac с использованием JDK1.6

java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
0 голосов
/ 24 марта 2012

Использование Windows Seven, java версии "1.6.0_29" и Firefox 8.0.1 работает нормально.Но с другими браузерами не работает ...

с небольшим изменением:

private static TransferHandler createTransferHandler() {
    return new TransferHandler() {
        @Override
        public boolean importData(JComponent comp,
                Transferable aTransferable) {
            DataFlavor[] transferData = aTransferable.getTransferDataFlavors();
            for(DataFlavor df:transferData){
                System.out.println(df.toString());
            }

            System.out.println("-----------------------------------");
            return true;
        }

        @Override
        public boolean canImport(JComponent comp,
                DataFlavor[] transferFlavors) {
            return true;
        }
    };
}

Я опускаю изображение из Firefox и в DataFlavor [] и вижу эту строку: java.awt.datatransfer.DataFlavor [mimetype = image / x-java-image; presentationclass = java.awt.Image]

В Chrome я не вижу эту строку: он не возвращает правильный тип MIME всопоставить с DataFlavor.imageFlavor

...