この記事の例では、Java がマウス ドラッグ アンド ドロップを使用してプログラム データを交換する方法、いわゆるマウス ドラッグ アンド ドロップ機能を説明します。マウスのドラッグ アンド ドロップ機能は、グラフィカル システムでよく使用されます。Java では、この機能をサポートする java.awt.dnd および java.awt.datatransfer パッケージが提供されています。この例では、ウィンドウ上部の「Hello World!」ラベルをマウスでクリックし、ウィンドウ下部のテキスト ボックスにドラッグ アンド ドロップを実装する方法を示します。 World!" がテキスト ボックスに追加されます。 !" テキストは上記のプロセスを続行します。
プログラム機能の具体的な実装アイデアと方法は次のとおりです。マウスのドラッグ アンド ドロップの実装において、最も重要な 2 つの概念は、ドラッグ ソースとドロップ ターゲット、つまりドラッグ ソースとドロップ ターゲットです。ドラッグ ソースとドロップ ターゲットは両方とも、表示されているコンポーネントに関連付けられています (表示されていない場合、どうやってドラッグできますか?!)。ドラッグ アンド ドロップ テクノロジの本質は、ドラッグ アンド ドロップ ソース コンポーネント上のデータを配置ターゲット コンポーネントに転送することです。したがって、下位レベルの観点から見ると、ドラッグ アンド ドロップはクリップボード テクノロジに非常に似ています。上の例では。
ドラッグ ソースの実装:ドラッグ ソース クラスは、最初に DragGestureRecognizer インスタンスを作成し、そのクラスがドラッグ ソース コンポーネント クラスであるか、ドラッグ ソース コンポーネントを含むことを示す必要があります。これは、DataSource オブジェクトの createDefaultDragGestureRecognizer() メソッドを呼び出すことで実現できます。具体的な実装は以下の通りです。
int action = DnDConstants.ACTION_COPY_OR_MOVE; //ドラッグ アンド ドロップ タイプ ds.createDefaultDragGestureRecognizer(this,action,this);
上記のステートメントは、ドラッグ ソース コンポーネントがこのクラス自体のインスタンス オブジェクトであり、完了するドラッグ アンド ドロップのタイプが DnDConstants.ACTION_COPY_OR_MOVE タイプであり、DragGestureListener インターフェイスを実装するクラスがこのクラスであることを示しています。ドラッグ ソースは通常、dragGestureRecognized() メソッドを定義する DragGestureListener インターフェイスを実装します。ドラッグが開始されると、DragGestureListener はイベントをリッスンし、ドラッグ データの送信などのイベントを処理するために、dragGestureRecognized() メソッドに転送します。ソース。具体的なコード:
public voidragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("MethodragGestureRecognized() はまだ実装されていません。"); try{Transferable tr = new StringSelection(this.getText()); //ラベルの転送データとしてのテキスト、Transferable によるオブジェクトのパッケージ化 //ドラッグを開始し、カーソルを DragSource.DefaultCopyNoDrop 形状に設定します。ドラッグ アンド ドロップ データは tr オブジェクトで、DragSourceListener はこのクラスです dge.startDrag(DragSource.DefaultCopyNoDrop,tr,this);}catch(Exception err) {エラー。printStackTrace();}}
ドラッグ ソースは、ドラッグ アンド ドロップに関連する各状態のイベント処理メソッドを定義する DragSourceListener インターフェイスも実装する必要があります。たとえば、dragEnter、dragOver、dropActionChanged、dragExit などのメソッドです。この例では、ドラッグ中のカーソルの形状を設定するために dragEnter() メソッドが実装され、その他のメソッドは空のメソッドになります。具体的な実装コードは以下の通りです。
public voidragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("メソッドragEnter()はまだ実装されていません。");DragSourceContext dsc = dsde.getDragSourceContext(); //ドラッグソースのコンテキスト参照を取得します/ / ドラッグ時のカーソル形状を設定 int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
ドロップ ターゲットの実装:このクラスがドロップ ターゲット コンポーネント クラスであること、またはドロップ ターゲット コンポーネントが含まれていることを示すために、最初に DragTarget インスタンスをドロップ ターゲット クラス内に作成する必要があります。実装は次のとおりです。
new DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);
上記のステートメントは、ドロップ ターゲットが this.jTextField1 オブジェクトであり、ドラッグ アンド ドロップ操作のタイプが DnDConstants.ACTION_COPY_OR_MOVE であり、DropTargetListener インターフェイスを実装するクラスが this クラスであることを示しています。 DrafSourceListener に対応して、ドロップ ターゲットまたはそのクラスは通常、DropTargetListener インターフェイスを実装します。このインターフェイスは、ドラッグ アンド ドロップ プロセスがさまざまな段階に入ったときにイベントを処理するための、dragEnter、dragOver などの多くのメソッドも定義します。この例では、配置対象コンポーネント上でマウスが放されたときのイベント処理である Drop() メソッドのみを扱います。たとえば、この例では、渡されたテキスト データを処理します。 JTextField コンポーネントに表示されるその他 このメソッドは空のメソッドであり、具体的なコードは次のとおりです。
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("メソッドdrop()はまだ実装されていません。");try{Transferable tr = dtde.getTransferable(); //渡されたデータオブジェクトを取得します/ /データ オブジェクトを処理し、テキスト情報を取得します。 (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText() +s); //ドラッグ元から渡されたテキスト情報をドロップ先に表示 dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){err.printStackTrace();}}
プログラムコード:
1.新しいプロジェクトを作成し、JDragAndDropDemo という名前を付けます。
2.新しいアプリケーションを作成し、JDragAndDropDemo という名前を付けます。メイン ウィンドウに MainFrame という名前を付け、JDragAndDropDemo という名前を付けます。
3.新しいクラスを作成し、DragJLabel という名前を付け、JLabel クラスを継承します。
4. wizards|implements インターフェイスを使用して、DragJLabel クラスに DragGestureListener インターフェイスと DragSourceListener インターフェイスを実装させます。
5. DragJLabel クラスに新しい属性 DragSource ds を追加します。コードは次のとおりです。
class DragJLabel extends JLabelimplements DragGestureListener, DragSourceListener {DragSource ds = DragSource.getDefaultDragSource(); //DragSource インスタンスを作成します...}
6. DragJLabelクラスのコンストラクタメソッドを記述します。
public DragJLabel(String title,intalignment){super(title,alignment); //親クラスのメソッドを使用 int action = DnDConstants.ACTION_COPY_OR_MOVE;ds.createDefaultDragGestureRecognizer(this,action,this); //Create}
7. DragJLabel クラスに dragGestureRecognized() メソッドを実装し、データをラップして送信します。
public voidragGestureRecognized(DragGestureEvent dge) {//throw new java.lang.UnsupportedOperationException("メソッドragGestureRecognized()はまだ実装されていません。");try{Transferable tr = new StringSelection(this.getText());dge.startDrag(DragSource .DefaultCopyNoDrop,tr,this);}catch(Exception err){err.printStackTrace();}}
8. DragJLabel クラスに dragEnter() メソッドを実装して、カーソルの形状を設定します。
public voidragEnter(DragSourceDragEvent dsde) {//throw new java.lang.UnsupportedOperationException("メソッドragEnter()はまだ実装されていません。");DragSourceContext dsc = dsde.getDragSourceContext();int action = dsde.getDropAction();if ((action&DnDConstants.ACTION_COPY)!=0)dsc.setCursor(DragSource.DefaultCopyDrop);elsedsc.setCursor(DragSource.DefaultCopyNoDrop);}
9. MainFrame クラスのデザイン ウィンドウの下部に JTextField コンポーネントを追加し、クラス内に DragJLabel インスタンスを作成します。具体的なコードは次のとおりです。
public class MainFrame extends JFrameimplements DropTargetListener {private JPanel contentPane;private BorderLayout borderLayout1 = new BorderLayout();private JTextField jTextField1 = new JTextField();DragJLabel label = new DragJLabel("Hello World!",SwingConstants.CENTER);……}
10. MainFrame クラスの初期化メソッド jbInit() を記述し、コンポーネントの初期プロパティを設定し、新しい DropTarget インスタンスを作成します。コードは次のとおりです。
private void jbInit() は例外をスローします {//setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[Your Icon]")));contentPane = (JPanel) this.getContentPane();contentPane.setLayout (borderLayout1);this.setSize(new Dimension(410, 114));this.setTitle("JDragAndDropDemo");jTextField1.setFont(new java.awt.Font("Dialog", 0, 14));contentPane.add(jTextField1, BorderLayout.SOUTH);contentPane.add(this) .label,BorderLayout.NORTH);新規DropTarget(this.jTextField1,DnDConstants.ACTION_COPY_OR_MOVE,this);}
11. wizards|implements インターフェイスを使用して、MainFrame クラスに DropTargetListener インターフェイスを実装させます。
12. DropTargetListener インターフェイスから継承したメソッド Drop() を実装して、渡されたデータを処理します。具体的なコードは次のとおりです。
public void drop(DropTargetDropEvent dtde) {//throw new java.lang.UnsupportedOperationException("メソッドdrop()はまだ実装されていません。");try{Transferable tr = dtde.getTransferable();if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)){dtde.acceptDrop(dtde.getDropAction());String s = (String) tr.getTransferData(DataFlavor.stringFlavor);this.jTextField1.setText(this.jTextField1.getText()+s);dtde.dropComplete(true);}else{dtde.rejectDrop();}}catch(Exception err){ err.printStackTrace();}}