4

システムクリップボードに保存するときに、Javaプログラムでテキストのフォーマットを保持する方法を理解しようとすると問題が発生します。

MicrosoftのワードパッドやLotusSymphonyなどでは機能しません。逆に、Wordでフォーマットされた文字列を作成してコピーすると、貼り付けようとするすべてのトライアルケースで正しく機能します。

org.eclipse。*などの外部ソースを使用したくありません。

これが私が正しい方向に向けられるのを助けるかもしれない私が編集したいくつかのリンクです。

適切なデータフレーバーを使用していないように感じますか? http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/datatransfer/DataFlavor.html

私はこのリンクを見つけました。これはデータフレーバーについて多くを語っていますが、フォーマットされたテキストにどのリンクを使用するかについてはあまり明らかにしていません。これはすべてのOSで同じではない可能性があることは理解していますが、使用しているOSでサポートされていることを確認する必要があります。

http://www.javaworld.com/cgi-bin/mailto/x_java.cgi?pagetosend=/export/home/httpd/javaworld/javaworld/javatips/jw-javatip61.html&pagename=/javaworld/javatips/jw-javatip61。 html&pageurl = http://www.javaworld.com/javaworld/javatips/jw-javatip61.html&site=jw_core

高度なご協力に感謝します。本当に感謝しています。

ダン

編集

私は現在、http://lists.apple.com/archives/java-dev/2004/Jul/msg00359.htmlからいくつかのコードを使用していますが、いくつかの小さな変更があります。私が現在抱えている問題は、2つの異なる形式でデータをクリップボードに送信する必要があることです。一部のプログラムを表示する「text/rtf」および「text/plain」は、RTFをサポートしていません。クリップボードの内部を使用して、クリップボードの内部を確認しています。RTFまたはプレーンテキストのいずれかを正常に配置できますが、両方を同時に配置することはできません。私がそうするとき、最後のものだけが追加されます。あなたの助けは大歓迎です!

要約すると、2つの異なるデータフレーバーでクリップボードを同時に設定することはできません。

import java.awt.datatransfer.*;
import java.io.*;

public class clipBoard
{
public static final String RTF_STRING = "{\\rtf1\\ansi\\deff0 {\\fonttbl {\\f0 Courier;}}\r  \n{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\r\nThis line is the default color\\line\r\n\\cf2\r\n\\tab This line is red and has a tab before it\\line\r\n\\cf1\r\n\\page This line is the default color and the first line on page 2\r\n}\r\n";
public static final DataFlavor RTF_FLAVOR = new DataFlavor("text/rtf", "Rich Formatted Text");

public static void main(String[] args){
 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
 Transferable t = new MyTransferable(
 new ByteArrayInputStream(RTF_STRING.getBytes()), RTF_FLAVOR);
 cb.setContents(t, null);
}

static class MyTransferable implements Transferable
{
    private Object data = null;
    private DataFlavor flavor;

    public MyTransferable(Object o, DataFlavor df)
    { data = o; flavor = df; }

    public Object getTransferData (DataFlavor df) throws
    UnsupportedFlavorException, IOException
    {
        if (!flavor.isMimeTypeEqual(flavor))
            throw new UnsupportedFlavorException(df);
        return data;
    }

    public boolean isDataFlavorSupported (DataFlavor df)
    {
        return flavor.isMimeTypeEqual(df);
    }

    public DataFlavor[] getTransferDataFlavors()
    {
        DataFlavor[] ret = {flavor};
        return ret;
    }
}

}

4

1 に答える 1

6

多くの検索と試行錯誤の後、友人のセバスチャンとローガンの助けを借りて、それが理解されたようです. これにより、複数の形式のデータを Java で一度にクリップ ボードに保存しながら、テキストのスタイルと書式を保持できます。うまくいけば、これは誰かを助けます。これも良い資料でした。http://www.pindari.com/rtf1.html

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;

public class clipBoard{
//Creates the RTF string 
private static final String RTF_STRING = "{\\rtf1\\ansi\\deff0\r\n{\\colortbl;\\red0\\green0\\blue0;\\red255\\green0\\blue0;}\r\nThis line is the default color\\line\r\n\\cf2\r\nThis line is red\\line\r\n\\cf1\r\nThis line is the default color\r\n}\r\n}";
//Creates the plain text string
private static final String PLAIN_STRING = "This line is the default color \n This line is red \n This line is the default color";
//Array of data for specific flavor
private static final Object data[] = {new ByteArrayInputStream(RTF_STRING.getBytes()),new ByteArrayInputStream(PLAIN_STRING.getBytes())};
//Plain favor
private static final DataFlavor PLAIN_FLAVOR = new DataFlavor("text/plain", "Plain Flavor");
//RTF flavor
private static final DataFlavor RTF_FLAVOR = new DataFlavor("text/rtf", "Rich Formatted Text");
//Array of data flavors
private static final DataFlavor flavors[] = {RTF_FLAVOR,PLAIN_FLAVOR};

public static void main(String[] args){
    //Create clip board object
    Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
    //Create transferable object
    Transferable p = new MyTransferable(data,flavors);
    //Transfer to clip board
    cb.setContents(p, null);
}

static class MyTransferable implements Transferable{
    //Array of data
    private Object dataA[] = null;
    //Array of flavors
    private DataFlavor flavorA[] = null;

    //Transferable class constructor
    public MyTransferable(Object data[], DataFlavor flavors[]){
        //Set the data passed in to the local variable
        dataA = data;
        //Set the flavors passes in to the local variable
        flavorA = flavors;
    }

    public Object getTransferData (DataFlavor df) throws UnsupportedFlavorException, IOException{
        //If text/rtf flavor is requested
        if (df.getMimeType().contains("text/rtf")){
            //Return text/rtf data
            return dataA[0];
        }
        //If plain flavor is requested
        else if (df.getMimeType().contains("text/plain")){
            //Return text/plain data
            return dataA[1];
        }
        else{
            throw new UnsupportedFlavorException(df);
        }
    }

    public boolean isDataFlavorSupported (DataFlavor df){
        //If the flavor is text/rtf or tet/plain return true
        if(df.getMimeType().contains("text/rtf") || df.getMimeType().contains("text/plain")){
            return true;
        }
        //Return false
        else{
            return false;
        }
    }

    public DataFlavor[] getTransferDataFlavors(){
        //Return array of flavors
        return flavorA;
    }
 }
}
于 2013-02-19T08:04:00.157 に答える