0

私はJavaアプリケーションを書いていますが、Mozillaからのブックマークデータをいくらか変更する機能を統合したいと思います。これは非常に複雑に聞こえますが、ドラッグアンドドロップの問題にすぎません。

1)使用可能なDataFlavorsがないため、MozillaライブラリからJavaアプリケーションに複数のブックマークエントリを実際にドロップすることはできません。したがって、明らかに、取得したTransferableから生データを読み取ることはできません...単一のエントリには78個のDataFlavorsが付属しています。複数のブックマークのドロップを有効にする方法はありますか?
すべてのブックマークをHTMLにエクスポートし、アプリ内からインポートすることでこの問題を回避できますが、あまり快適ではありません。

2)URLをMozillaブックマークにエクスポートする方法を理解するのも非常に困難です。たとえば、最良の動作は、Mozillaがハイパーリンクの場合と同じ方法で私のデータを認識することです。ブラウザ内からブックマークライブラリにGoogleなどのリンクをドロップすると、名前が「Google」、URLが「http://www.google.com」のエントリがすぐに作成されます。しかし、Mozilla Firefoxライブラリは明らかに他のものを受け入れないため、私のアプリケーションはjava.io.Readerの実装を返すことを余儀なくされています。

TL; DR:(ドラッグアンドドロップで)方法はありますか?1)複数のブックマークをMozillaからJava Appにインポートし、2)あらゆる種類の転送可能なデータをMozillaブックマークライブラリにエクスポートして、名前URLの両方がFirefoxによって直接認識されるようにします?

私の質問が明確であることを願っています。

よろしくお願いいたします。

4

2 に答える 2

1

何度も試行錯誤した結果、この型text/x-moz-urlは実際にはテキスト型ではなく、バイナリ型であることに気付きました。それに関連付けられた文字セットはありません。常に UTF-16LE です。

以下は、少なくとも x86 Linux では機能しますが、Firefox の Windows バージョンではまったく機能しません。

static class Bookmark
implements Transferable {

    private final String mimeType;
    private final byte[] bytes;

    Bookmark(String uri,
             String name) {
        String text = uri + "\r\n" + name;
        this.bytes = text.getBytes(StandardCharsets.UTF_16LE);
        this.mimeType = "text/x-moz-url";
    }

    public DataFlavor[] getTransferDataFlavors() {
        try {
            return new DataFlavor[] {
                new DataFlavor(mimeType + "; class=java.io.InputStream"),
                new DataFlavor(mimeType + "; class=java.nio.ByteBuffer"),
                new DataFlavor(mimeType + "; class=\"[B\""),
            };
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

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

    public Object getTransferData(DataFlavor flavor)
    throws IOException,
           UnsupportedFlavorException {

        Class<?> cls = flavor.getRepresentationClass();
        if (cls.equals(byte[].class)) {
            return bytes;
        }
        if (cls.equals(ByteBuffer.class)) {
            return ByteBuffer.wrap(bytes);
        }
        if (cls.equals(InputStream.class)) {
            return new ByteArrayInputStream(bytes);
        }

        throw new UnsupportedFlavorException(flavor);
    }
}

Windows で動作しない理由は、Windows 版の Firefox が明らかに を使用していないためtext/x-moz-urlです。Firefox からブックマークをドラッグして、サポートされている DataFlavors を印刷するとtext/x-moz-url、リストにまったく表示されません。文字列フレーバー ( および を含む) と、表現クラスが java.net.URL であるフレーバーのみtext/htmltext/uri-listサポートさtext/htmlれており、上記のように、Firefox が提供できるタイプのように見える を除いて、それらのいずれもブックマークの名前を保持できませんが、受け付けません。

于 2012-12-31T16:25:58.740 に答える
0

2013 年 1 月現在、Windows 7用の Java (7u10) / Firefox (17.0.1) の現在のバージョンでは、やりたいことを実行する方法がないようです。

複数のブックマークを Java アプリケーションにドラッグすると、DataFlavor がないため、それらから読み取ることはできません。
ブックマークを Firefox にドロップすることも不可能に思えます - 指定するだけでtext/x-moz-urlFirefox はデータを「受け入れる」ようになりますが、Firefox はそれから読み取ろうとはしません (メソッドが呼び出されることはありません)。2 つ以上text/x-moz-url(例: text/x-moz-url; class=java.io.Reader) を指定すると、Firefox はデータをまったく受け入れなくなります。

誰かが安定したソリューションを提供できない限り、この質問は技術的に回答されています。

不可能です。

于 2013-01-11T12:35:19.537 に答える