My Java (Java 21) имеет часть графического интерфейса, который позволяет перетаскивать изображение, найденное в Google в веб-браузере в приложение, вкусный вкус URL-адрес Сообщение также регистрируется. Ничто даже не зарегистрировано. Основываясь на предложении VGR I теперь регистрируется, если есть исключение, а также я регистрируюсь, когда сначала вводим метод DROP. EM> Метод Таким образом, кажется, что macOS предотвращает падение перетаскивания еще до того, как он добрался до моего кода . от Finder вместо
Что вызывает разницу? em> < /p>
package com.jthink.songkong.ui.startdialog.editsongs;
import com.jthink.songkong.analyse.general.ArtworkHelper;
import com.jthink.songkong.analyse.musicbrainz.RemoteArtworkLookup;
import com.jthink.songkong.db.ImageCache;
import com.jthink.songkong.db.SongCache;
import com.jthink.songkong.preferences.UserOption;
import com.jthink.songkong.preferences.UserPreferences;
import com.jthink.songkong.ui.MainWindow;
import com.jthink.songkong.ui.startdialog.imagefilters.ImageFileFilter;
import com.jthink.songkong.ui.startdialog.imagefilters.ImageFilterFactory;
import com.jthink.songlayer.CoverImage;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.nio.file.Files;
import java.util.logging.Level;
import static com.jthink.songkong.ui.startdialog.editsongs.ArtworkTab.ARTWORK_SIZE;
import static com.jthink.songkong.ui.startdialog.editsongs.ImageSizeDefaults.MAX_IMAGE_SIZE;
import static com.jthink.songkong.ui.startdialog.editsongs.ImageSizeDefaults.MIN_IMAGE_SIZE;
public class ArtworkDropTarget extends DropTarget
{
private static CoverImage coverImage;
private JLabel displayArtwork;
public static DataFlavor uriListFlavor; //This is used by Linux for loading files
public static DataFlavor imageFlavor; //This is used by Firefox, when drag single image file
public static DataFlavor urlFlavour; //This is used by Firefox, when drag single image file
public static DataFlavor pictImageFlavor; //This is used by OSX for iTunes
public static DataFlavor imageIconDataFlavor; //When dragging from existingArtwork
static
{
try
{
uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
urlFlavour = new DataFlavor("application/x-java-url;class=java.net.URL");
imageFlavor = new DataFlavor("image/x-java-image;class=java.awt.Image");
pictImageFlavor = new DataFlavor("image/x-pict;class=java.io.InputStream");
imageIconDataFlavor = new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType +
";class=\""+javax.swing.Icon.class.getName() + "\"");
}
catch (ClassNotFoundException cne)
{
throw new RuntimeException("unable to create uri-list flavor in drop target:" + cne.getMessage());
}
}
public ArtworkDropTarget(Component c, JLabel displayArtwork)
throws HeadlessException
{
super(c, DnDConstants.ACTION_COPY, null, true, null);
this.displayArtwork= displayArtwork;
}
public static void setCoverImage(CoverImage coverImage)
{
ArtworkDropTarget.coverImage = coverImage;
}
/**
* When used as Drop target
*
* @param dtde
*/
public synchronized void drop(DropTargetDropEvent dtde)
{
MainWindow.logger.severe("Starting Drop");
dtde.acceptDrop(DnDConstants.ACTION_COPY);
Transferable trans = dtde.getTransferable();
try
{
if (trans.isDataFlavorSupported(imageIconDataFlavor))
{
MainWindow.logger.severe("Received ImageIcon:"+trans.getTransferData(imageIconDataFlavor));
ImageIconWithOriginalImage icon = (ImageIconWithOriginalImage)trans.getTransferData(imageIconDataFlavor);
setExistingArtwork((BufferedImage)icon.getOriginalImage());
}
else if (trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && ImageFilterFactory.getImageFilter().accept(((java.util.List) trans.getTransferData(DataFlavor.javaFileListFlavor)).get(0)))
{
MainWindow.logger.severe("Received Files:"+trans.getTransferData(DataFlavor.javaFileListFlavor));
File file = ((java.util.List) trans.getTransferData(DataFlavor.javaFileListFlavor)).get(0);
setExistingArtwork(file);
}
else if (trans.isDataFlavorSupported(imageFlavor) && trans.getTransferData(ArtworkDropTarget.imageFlavor) instanceof BufferedImage)
{
MainWindow.logger.severe("Received Image:"+trans.getTransferData(ArtworkDropTarget.imageFlavor));
setExistingArtwork((BufferedImage)trans.getTransferData(ArtworkDropTarget.imageFlavor));
}
else if (trans.isDataFlavorSupported(urlFlavour))
{
URI imageUri = ((URL) trans.getTransferData(ArtworkDropTarget.urlFlavour)).toURI();
MainWindow.logger.severe("Received ImageUrl:" + imageUri);
URI subUri = GoogleImageSearch.getImageUrlFromImageSearchUrl(imageUri);
if (GoogleImageSearch.isGoogleImageSearch(imageUri) && subUri!=null)
{
MainWindow.logger.severe("Received ImageSubUrl:" + subUri);
setExistingArtwork(subUri);
}
else
{
MainWindow.logger.severe("Received ImageUrl:" + imageUri);
setExistingArtwork(imageUri);
}
}
else
{
MainWindow.logger.severe("Unknown DataFlavor for ImageUrl");
for(DataFlavor next:trans.getTransferDataFlavors())
{
MainWindow.logger.severe(next.toString());
}
}
dtde.dropComplete(true);
}
catch(Exception ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
dtde.dropComplete(false);
}
}
/**
* TODO do we have to convert to JPG, cant we keep as PNG
* @param image
*/
private void setExistingArtwork(BufferedImage image)
{
try
{
byte[] imageData = writeCompressedJpegImageToByteArray(image, 1.0f);
coverImage = ImageCache.saveNewCoverImage(image, imageData, "internet", com.jthink.songlayer.CoverImage.createKeyFromData(imageData),
MIN_IMAGE_SIZE,
UserOption.ARTWORK_MAX_SIZE.getIntValue()
);
SongCache.saveImagesForReport(coverImage, null);
createNewArtworkImage(image);
}
catch (IOException ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
/**
* Write Compressed Jpeg, use minimum compression of 1f for best quality
*
* @param bi
* @param compressionLevel
* @return
* @throws IOException
*/
private static byte[] writeCompressedJpegImageToByteArray(BufferedImage bi, float compressionLevel) throws IOException
{
ImageWriter imageWriter = ImageIO.getImageWritersByFormatName( "jpg").next();
ImageWriteParam writeParams = imageWriter.getDefaultWriteParam();
writeParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParams.setCompressionQuality(compressionLevel);
final ByteArrayOutputStream output = new ByteArrayOutputStream();
imageWriter.setOutput( new MemoryCacheImageOutputStream(output));
IIOImage outputImage = new IIOImage(bi, null, null);
imageWriter.write(null, outputImage, writeParams);
imageWriter.dispose();
output.flush();
final byte[] imageData = output.toByteArray();
return imageData;
}
/**
*
* @param imageUri
*/
private void setExistingArtwork(URI imageUri)
{
byte[] imageData = RemoteArtworkLookup.getDirectImage(imageUri.toString());
if (imageData != null)
{
BufferedImage image = ArtworkHelper.createBufferedImageFromRawData(imageData, imageUri.toString());
coverImage = ImageCache.saveNewCoverImage(image, imageData, "internet", com.jthink.songlayer.CoverImage.createKeyFromData(imageData),
UserPreferences.getInstance().getMinImageSize(),
(Integer) UserOption.ARTWORK_MAX_SIZE.getUserPref().getValue());
SongCache.saveImagesForReport(coverImage, null);
createNewArtworkImage(image);
}
else
{
MainWindow.logger.severe("Unable To Decode Image:"+imageUri.toString());
}
}
/**
*
* @param file
*/
private void setExistingArtwork(File file)
{
try
{
ImageFileFilter iff = ImageFilterFactory.getImageFilter();
if(iff.accept(file))
{
byte[] imageData = Files.readAllBytes(file.toPath());
BufferedImage image = ArtworkHelper.createBufferedImageFromRawData(imageData, file.getName());
coverImage = ImageCache.saveNewCoverImage(image, imageData, file.getName(),
com.jthink.songlayer.CoverImage.createKeyFromData(imageData),
UserPreferences.getInstance().getMinImageSize(),
(Integer) UserOption.ARTWORK_MAX_SIZE.getUserPref().getValue());
SongCache.saveImagesForReport(coverImage, null);
createNewArtworkImage(image);
}
}
catch(Exception ex)
{
MainWindow.logger.log(Level.SEVERE, ex.getMessage(), ex);
}
}
/**
* Update new artwork label with version of this image
*
* @param image
*/
private void createNewArtworkImage(BufferedImage image)
{
BufferedImage ret = new BufferedImage(ARTWORK_SIZE, ARTWORK_SIZE, BufferedImage.TYPE_INT_RGB);
ret.getGraphics().drawImage(image, 0, 0, ARTWORK_SIZE, ARTWORK_SIZE, null);
ImageIcon ii = new ImageIcon(ret);
displayArtwork.setIcon(ii);
displayArtwork.setText(image.getWidth() + " x " + image.getHeight());
ArtworkFont.formatArtworkLabel(displayArtwork);
}
public static CoverImage getCoverImage()
{
return coverImage;
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -for-macos
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS
Anonymous » » в форуме JAVA - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS
Anonymous » » в форуме JAVA - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS
Anonymous » » в форуме JAVA - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Отбрасывание URL -адреса изображения с WebBrowser в приложении Java не работает для MacOS
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-