Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java中的dragNdrop将.svg图像传输到其他程序_Java_Svg - Fatal编程技术网

如何使用java中的dragNdrop将.svg图像传输到其他程序

如何使用java中的dragNdrop将.svg图像传输到其他程序,java,svg,Java,Svg,我在ArrayList中有一个svg图像。如何使用java轻松地将其传输到其他程序 我知道如何将文本复制到剪贴板,尽管这并不能使其作为.svg图像粘贴到inkscape中 我尝试从svg图像创建一个文件,这很有效,因为这样我就可以进入文件浏览器并从那里复制图像。这是次优的想法 有没有办法把它作为svg图像放到剪贴板上 克里斯托弗 我设法找到了答案,将mimetype设置为image/x-inkscape-svg。在帮助下,我还必须指定,以便java运行时理解如何将image/x-inkscap

我在ArrayList中有一个svg图像。如何使用java轻松地将其传输到其他程序

我知道如何将文本复制到剪贴板,尽管这并不能使其作为.svg图像粘贴到inkscape中

我尝试从svg图像创建一个文件,这很有效,因为这样我就可以进入文件浏览器并从那里复制图像。这是次优的想法

有没有办法把它作为svg图像放到剪贴板上

  • 克里斯托弗

我设法找到了答案,将mimetype设置为image/x-inkscape-svg。在帮助下,我还必须指定,以便java运行时理解如何将image/x-inkscape-svg作为外部mimetype处理

这是我创建的能够传输文件的类

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;




public class SvgClip implements Transferable
{

    final private String svgstring;

    //https://bugs.openjdk.java.net/browse/JDK-8140526
    //http://bugs.java.com/bugdatabase/view_bug.do;jsessionid=67bf0d656b66cc60360819906ba?bug_id=4493178
    //solved!
    //http://www.javaexamples.org/java/java.awt.datatransfer/getdefaultflavormap-in-systemflavormap.html

    static final private DataFlavor svgFlavor = new DataFlavor("image/svg+xml; class=java.io.InputStream","Scalable Vector Graphic");
    static final private DataFlavor inkscapeFlavor = new DataFlavor("image/x-inkscape-svg; class=java.io.InputStream","Scalable Vector Graphic");
    //static private DataFlavor svgFlavor = new DataFlavor(String.class,"image/svg+xml");


    private DataFlavor [] supportedFlavors;
    private FileTransferable file;

    public SvgClip(String str)       
    {
        /*
        try {
            this.svgFlavor = new DataFlavor("image/svg+xml");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(SvgClip.class.getName()).log(Level.SEVERE, null, ex);
        }
*/

        this.supportedFlavors = new DataFlavor[] {
            svgFlavor, 
            DataFlavor.javaFileListFlavor,
            inkscapeFlavor
        };

        this.svgstring = str;

        SystemFlavorMap systemFlavorMap = (SystemFlavorMap) SystemFlavorMap.getDefaultFlavorMap();
        DataFlavor dataFlavor = svgFlavor;
        //systemFlavorMap.addFlavorForUnencodedNative("image/svg+xml", dataFlavor);
        systemFlavorMap.addUnencodedNativeForFlavor(dataFlavor, "image/svg+xml");
        systemFlavorMap.addUnencodedNativeForFlavor(inkscapeFlavor, "image/x-inkscape-svg");

        try{
            this.file = FileTransferable.createFileInTempDirectory("temp.svg");
            List<File> files = file.getFiles();
            if(files.isEmpty())
            {
                System.out.println("No file!");
            }
            else
            {
                //write the svgstring to a file in temp.
                PrintWriter writer = new PrintWriter(files.get(0));
                writer.println(svgstring);
                writer.close();

            }
        }
        catch(Exception Ex)
        {
            Ex.printStackTrace();
        }
    }

    @Override public DataFlavor[] getTransferDataFlavors()
    {    
          return this.supportedFlavors;    
    }
    static DataFlavor getSVGFlavor()
    {
        return SvgClip.svgFlavor;
    }
    @Override public boolean isDataFlavorSupported(DataFlavor flavor)        
    {   

        for( DataFlavor supported : this.supportedFlavors)
        {
            if( flavor.equals(supported)){
                System.out.println("flavor is supported " + 
                        flavor.getMimeType()
                + " " + flavor.toString()
                        );
                return true;
            }
            else{
                System.out.println("flavor is NOT supported " + flavor.getMimeType());

            }
        }
        return false;    
    }

    @Override public Object getTransferData(DataFlavor flavor)
            throws UnsupportedFlavorException, IOException 
    {
        if (isDataFlavorSupported(flavor))
        {

            if(flavor.equals(inkscapeFlavor) || flavor.equals(svgFlavor))
            {
                InputStream stream = new ByteArrayInputStream(svgstring.getBytes(StandardCharsets.UTF_8));
                return stream;
            }
            if(flavor.equals(DataFlavor.javaFileListFlavor))
            {
                System.out.println("Returning file");
                return this.file.getTransferData(flavor);
            }
        }
        throw new UnsupportedFlavorException (flavor);
    }

    public void lostOwnership(java.awt.datatransfer.Clipboard clip,        
            java.awt.datatransfer.Transferable tr)        
    {    
        return;    
    }
}
import java.io.ByteArrayInputStream;
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.PrintWriter;
导入java.nio.charset.StandardCharset;
导入java.util.List;
公共类SvgClip实现可转移
{
最终私有字符串svgstring;
//https://bugs.openjdk.java.net/browse/JDK-8140526
//http://bugs.java.com/bugdatabase/view_bug.do;jsessionid=67bf0d656b66cc60360819906ba?bug_id=4493178
//解决了!
//http://www.javaexamples.org/java/java.awt.datatransfer/getdefaultflavormap-in-systemflavormap.html
静态最终私有DataFlavor svgFlavor=newdataflavor(“image/svg+xml;class=java.io.InputStream”,“可缩放向量图形”);
静态最终私有DataFlavor inkscapeFlavor=新DataFlavor(“image/x-inkscape-svg;class=java.io.InputStream”,“可缩放向量图形”);
//静态私有DataFlavor svgFlavor=newdataflavor(String.class,“image/svg+xml”);
私有DataFlavor[]支持的Flavors;
私人文件;可转让文件;
公共SvgClip(字符串str)
{
/*
试一试{
this.svgFlavor=newdataflavor(“image/svg+xml”);
}捕获(ClassNotFoundException ex){
Logger.getLogger(SvgClip.class.getName()).log(Level.SEVERE,null,ex);
}
*/
this.supportedFlavors=新的DataFlavor[]{
svgFlavor,
DataFlavor.javaFileListFlavor,
墨汁风味
};
this.svgstring=str;
SystemFlavorMap SystemFlavorMap=(SystemFlavorMap)SystemFlavorMap.getDefaultFlavorMap();
DataFlavor DataFlavor=svgFlavor;
//systemFlavorMap.addFlavorForUnencodedNative(“图像/svg+xml”,dataFlavor);
systemFlavorMap.addUnencodedNativeForFlavor(dataFlavor,“图像/svg+xml”);
systemFlavorMap.addUnencodedNativeForFlavor(inkscapeFlavor,“图像/x-inkscape-svg”);
试一试{
this.file=FileTransferable.createFileInTempDirectory(“temp.svg”);
List files=file.getFiles();
if(files.isEmpty())
{
System.out.println(“没有文件!”);
}
其他的
{
//将svgstring写入temp中的文件。
PrintWriter=新的PrintWriter(files.get(0));
writer.println(svgstring);
writer.close();
}
}
捕获(例外情况除外)
{
例如printStackTrace();
}
}
@重写公共DataFlavor[]getTransferDataFlavors()
{    
返回此.supportedFlavors;
}
静态DataFlavor getSVGFlavor()
{
返回SvgClip.svgFlavor;
}
@支持重写公共布尔值IsDataFlavor(DataFlavor)
{   
for(DataFlavor支持:this.supportedFlavors)
{
if(风味等于(支持)){
System.out.println(“支持味道”+
flavor.getMimeType()
+“”+flavor.toString()
);
返回true;
}
否则{
System.out.println(“不支持味道”+flavor.getMimeType());
}
}
返回false;
}
@重写公共对象getTransferData(DataFlavor)
抛出不受支持的LavorException,IOException
{
如果(isDataFlavorSupported(flavor))
{
if(flavor.equals(inkscapeFlavor)| flavor.equals(svgFlavor))
{
InputStream=newbytearrayinputstream(svgstring.getBytes(StandardCharsets.UTF_8));
回流;
}
if(flavor.equals(DataFlavor.javaFileListFlavor))
{
System.out.println(“返回文件”);
返回这个.file.getTransferData(flavor);
}
}
抛出新的不受支持的LavorException(flavor);
}
public void lostOwnership(java.awt.datatransfer.clip,
java.awt.datatransfer.tr)
{    
返回;
}
}

有多种方法可以做到这一点,但您需要知道目标程序需要的数据是谁。在这种情况下,目标程序应该是inkscape。我怎样才能找到Inkscape想要的东西呢?我一直在玩弄它输出的东西,但它只输出图像,这是没有帮助的。您可以尝试创建svg数据风格或xml。环顾四周,似乎预期的mime类型是image/svg+xmlWell,但我不知道如何创建一个可转换为image/svg+xml格式的mime。