Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

10.8 データ転送

このセクションでは、アプリケーションにドラッグ・アンド・ドロップ(DnD)およびカット・アンド・ペースト/コピー・アンド・ペースト(CCP)操作を追加できる、データ転送機能に関連して発生する可能性のある問題について説明します。

10.8.1 ドラッグ・アンド・ドロップ・アプリケーションのデバッグ

デバッガを使用してDnD機能をトラブルシューティングするのは困難です。ドラッグ・アンド・ドロップ操作中はすべての入力がグラブされるからです。そのため、DnDの操作中にブレークポイントを入れた場合は、Xサーバーの再起動が必要になることがあります。かわりに、リモート・デバッグを使用してみてください。

DnDに関するほとんどの問題のトラブルシューティングには、2つの単純な方法を使用できます。

  • すべてのDataFlavorインスタンスの出力

  • 受信されたデータの出力

リモート・デバッグに代わる方法として、遅延なしで出力するSystem.err.println()関数があります。

10.8.2 データ転送に関するよくある問題

 このセクションでは、AWTのデータ転送操作で頻繁に発生するいくつかの問題を説明し、そのトラブルシューティング方法を提示します。

  1. 問題1 - 大量のデータをクリップボードからペーストするのに時間がかかりすぎる。

    Clipboard.getContents()関数を使ってペースト操作を行うと、アプリケーションが少しの間、ハング・アップすることがあります(特にペースト対象データの提供元がリッチ・アプリケーションである場合)。

    Clipboard.getContents()関数は、使用可能なすべてのフレーバ(いくつかのテキスト・フレーバやイメージ・フレーバなど)に含まれるクリップボード・データを取得しますが、これはコストが高く、不要である可能性があります。

    解決方法: Clipboard.getData()メソッドを使って特定のデータのみをクリップボードから取得します。1つのフレーバまたは少数のフレーバのみのデータが必要な場合は、getContents()の代わりに次のいずれかのClipboardメソッドを使用してください。

    • DataFlavor[] getAvailableDataFlavors()

    • boolean isDataFlavorAvailable(DataFlavor flavor)

    • Object getData(DataFlavor flavor)

  2. 問題2 - JavaアプリケーションでDnD操作にTransferable.getTransferData()を使用すると、ドラッグに長い時間がかかるように思われる。

    転送データの初期化を必要な場合にのみ行えるよう、Transferable.getTransferData()内に初期化コードが配置されました。

    Transferableデータの生成コストは高く、DnD操作中にTransferable.getTransferData()が複数回呼び出されるため、速度が低下します。

    解決方法: Transferableデータをキャッシュに入れて、一度しか生成されないようにします。

  3. 問題3 - JavaアプリケーションとGNOME/KDEデスクトップおよびファイル・ブラウザとの間でファイルを転送できない。

    Windowsや一部のウィンドウ・マネージャでは、転送ファイルのリストはDataFlavor.javaFileListFlavorデータ・フレーバとして表現できます。しかし、すべてのウィンドウ・マネージャがファイルのリストをこの形式で表現するわけではありません。たとえば、GNOMEウィンドウ・マネージャは、ファイル・リストをURIのリストとして表現します。

    回避方法: ファイルを取得するには、String型のデータを要求したあと、RFC 2483で説明されているtext/uri-list形式に従って文字列をファイルのリストに変換します。JavaアプリケーションからGNOME/KDEデスクトップやファイル・ブラウザにファイルをドロップできるようにするには、text/uri-list形式でデータをエクスポートします。コード例については、RFEの回避方法のセクションを参照してください。

    解決方法: DnD操作中のマウス・カーソルの動きに合わせて、表面にイメージがレンダリングされたウィンドウを移動します。RFEの回避方法のセクションに記載されたコード例を参照してください。

  4. 問題4 - DragGestureEventまたはDragSourcestartDrag()メソッドの1つに渡したイメージが、後続のDnD操作中に表示されない。

  5. 問題5 - DnDを使用して配列を移動する方法がない。

    DataFlavorクラスには、配列を処理するコンストラクタはありません。配列のMIMEタイプには、エスケープすべき文字が含まれます。例10-7のコードでは、IllegalArgumentExceptionがスローされます。

    解決方法: 例10-8に示すように、表現クラスのパラメータの値を引用符で囲みます(引用符がエスケープされている)。

    詳細は、このバグ・レポートを参照してください。

  6. 問題6 - SwingコンポーネントでAWTのDnDサポートを使用すると、問題が発生する。

    DnD操作時に奇妙なイベントが発生する、複数の項目をドラッグ・アンド・ドロップできない、InvalidDnDOperationExceptionがスローされるなど、さまざまな問題が発生する可能性があります。

    解決方法: SwingコンポーネントではSwingのDnDサポートを使用します。SwingのDnD実装はAWTのDnD実装に基づいていますが、SwingとAWTのDnDを混在させることはできません。詳細は、SwingのチュートリアルのDnDに関する項およびJava Swingのドキュメントを参照してください。

  7. 問題7 - ターゲットに依存するようにソースの状態を変更する方法がない。

    ターゲットに依存するようにソースの状態を変更するには、ソース・コンポーネントとターゲット・コンポーネントへの参照が同じコード領域内で必要になりますが、これは現時点ではDnD APIに実装されていません。

    回避方法: 回避方法の1つは、イベントのコンテキストを判定できるようにするためのフラグを、転送可能オブジェクトに追加することです。

    1つのJava VM内でのデータ転送では、次の回避方法を提案します。

  8. 問題8 - アプリケーション内でのオブジェクトの転送に時間がかかる。

    大量データの転送や転送オブジェクトの作成にかかる時間が長すぎます。ユーザーは、データ転送が完了するまで長時間待つ必要があります。

    この高コスト処理で転送に時間がかかりすぎるのは、Transferable.getTransferData()が終了するまで待つ必要があるからです。

    解決方法: この解決方法が有効なのは、1つのJava VM内でデータを転送する場合だけです。ドラッグ操作の前に、高コストのリソースを作成または取得しておきます。たとえば、Transferable.getTransferData()の処理時間が長くなりすぎないよう、転送可能オブジェクトの作成時にファイルのコンテンツを取得します。

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.