| 
      		
    
           | 
       
    
    
     
      1. ソースコードダウンロード 
      => 
            ComponentLib.zip
       
      2. テスト項目 
      (1)部品をドラッグアンドドロップ(Drag and Drop)操作で移動する(図1) 
      (2)部品をドラッグアンドドロップ(Drag and Drop)操作で描画画面にコピーし新しい図形を作成する(図2)。 
      (注)"add component", "del component"ボタンはこのテストコードでは無効である。 
        
        
      
        
          
            | 
               
             | 
            
                
             | 
           
          
            |  (a) 部品(黒枠内)をドラッグアンドドロップで移動(太い縦線位置) | 
             (b)部品を先頭へ移動した結果 | 
           
          
            | 図1  選択した部品をドラッグして表示位置を変更 | 
           
        
       
         
        
      
        
          
            | 
               
             | 
           
          
            |  図 2 ドラッグアンドドロップ操作で描画画面上に部品図形を作成 | 
           
        
       
        
        
      3. テストコード 
        
      
        
          
            | 
             コンポーネント 
             | 
            
             説明 
             | 
           
          
            | 
             DrawMain 
             | 
            
             メインクラス 
            ・部品の図形データを作成する。矩形と楕円だけ。 
            ・ComponentLibDialog のshowDialogメソッドでダイアログを表示する。 
             | 
           
          
            | ObjectTable | 
            主要オブジェクトを登録する。 
            例えばObjectTable.getComponentLibDialog()でComponentLibDialogオブジェクトを取得する。 | 
           
          
            | ComponentLibDialog | 
            
             ダイアログを作成し、表示するコード 
            • addComponent, deleteComponentボタンのアクション処理はインプリメントしない。したがって無効。 
            • showDialog 
            this.componentManager.readComponentList();は無効 
            表示データは次の行で取得する。 
             ShapeContainer[] containers=this.getContainerManager().getContainers(); 
             
             | 
           
          
            | ComponentLibPanel | 
            
             すぐにアプリケーションに組み込めるコード 
            ・部品を表示するパネル。 
            ・マウスのDrag and Drop操作により部品を並べ替えることができる。 
            ・マウスのDrag and Drop操作により部品をDrawPanelにコピーできる。 
             | 
           
          
            | ComponentManager | 
            テスト用のコード 
            ・部品データをファイル入出力を行うクラスだが、writeComponentList, ReadComponentListメソッドはダミー 
            ・部品を並べ替えを実行するため ArrayListでの順番を変更する。moveComponentメソッド。 | 
           
          
            | ContainerManager | 
            テスト用のコード 
            ・部品データをArrayListに格納する。 | 
           
          
            | DrawPanel | 
            テスト用のコード 
            ・図形描画パネル(キャンバス) 
            ・Drag and Drop操作のDropTargetになる。 | 
           
          
            | TransferableComponent | 
            Drag and Drop操作で転送される部品データ | 
           
          
            | ShapeContainer | 
            テスト用のコード 
            図形データのコンテナで、このテストに必要な最小限の機能を持つ。次の機能を持つ。 
            ・DrawPanelに図形を表示 
            ・クローン作成 
            ・平行移動 
            ・Id設定可能 | 
           
          
            | MultiLineToolTip | 
            複数行のツールチップ 
             =>http://www.java2s.com/Code/Java/Swing-JFC/MultiLineToolTipExample.htm | 
           
        
       
       
      3. Drag and Drop操作 
        
      3.1 部品を移動する(図1) 
      ・関係するクラス: ComponentLibPanelクラス 
      Drag and Drop操作の場所が"Component Lib"パネルなので"ComponentLibPanelクラスだけが関係する。 
       
      
        
          
            | 
             コンポーネント 
             | 
            
             説明 
             | 
           
          
            | 
             DragSource 
             | 
            
             DragSourceはComponentLibPanel。 
            ComponentLibPanelコンストラクタで次のように設定する。 
            DragSource dragSource = DragSource.getDefaultDragSource(); 
            dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY,
            this); 
             
             | 
           
          
            | DropTarget | 
            
             DropTargetはComponentLibPanel。 
            ComponentLibPanelコンストラクタで次のように設定する 
            DropTarget dropTarget = new DropTarget(this, this); 
             
             | 
           
          
            | DropSouceListener | 
            インプリメントしない | 
           
          
            | DragGestureListener | 
            
             ComponentLibPanelにインプリメント 
            ・dragGestureRecognizedメソッド 
            部品の図形データをTransferableComponentにセットして、DragGestureEventのstartDragメソッドを呼ぶ 
            TransferableComponent transfer=new TransferableComponent((ShapeContainer)container.clone()); 
            e.startDrag(DragSource.DefaultCopyDrop, transfer); 
             
             | 
           
          
            | DropTargetListener | 
            
             ComponentLibPanelにインプリメント 
            (1) dragOverメソッド 
            MouseListenerのmouseDraggedメソッドを呼ぶ(次の欄を参照)。 
            (2)dropメソッド 
            drop位置がComponentLibPanel上か否かチェックする。ComponentLibPanel上ならばMouseListenerのmouseReleasedメソッドを呼ぶ(次の欄を参照)。TransferableComponentにセットされた部品の図形データは参照せず、mousePressedメソッドで決めた移動する部品番号を参照する。 
             
             | 
           
          
            | MouseListener,  MouseMotionListener | 
            
             ComponentLibPanelにインプリメント 
            部品の移動だけならば、この2つのリスナーのメソッドをインプリメントすればできる。しかし3.2を実現するためにDragGestureListenerをインプリメントすると、mouseDragged,
            mouseReleasedなどのメソッドが正しく動作しない(mousePressedは正しく動作する)。 
            そこでmouseDraggedメソッドはDragTargetListener のdragOverメソッドで代用し、このメソッドからmouseDraggedメソッドを呼び出す。 
            またmouseReleasedメソッドはDragTargetListener のdroprメソッドで代用し、このメソッドからmouseReleasedメソッドを呼び出す。 
            mousePressedメソッドは、プレス時の座標から移動する部品を選び、部品表示のセルの境界に黒枠を表示する処理に使う。 
             
             | 
           
        
       
       
       
      3.2 部品を描画画面にコピーする(図2) 
      ・関係するクラス: ComponentLibPanel, DrawPanelクラス 
      Drag操作開始位置がComponentLibPanel、Drop場所がDrawPanelなのでComponentLibPanelとDrawPanelクラスが関係する。 
        
      
        
          
            | 
             コンポーネント 
             | 
            
             説明 
             | 
           
          
            | 
             DragSource 
             | 
            
             DragSourceはComponentLibPanel。 
            ComponentLibPanelコンストラクタで次のように設定する(3.1と同じ)。 
            DragSource dragSource = DragSource.getDefaultDragSource(); 
            dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY,
            this); 
             
             | 
           
          
            | DropTarget | 
            
             DropTargetはComponentLibPanel。 
            DrawPanelコンストラクタで次のように設定する 
            DropTarget dropTarget = new DropTarget(this, this);  
            this.setDropTarget(dropTarget); 
             
             | 
           
          
            | DropSouceListener | 
            インプリメントしない | 
           
          
            | DragGestureListener | 
            
             ComponentLibPanelにインプリメント 
            ・dragGestureRecognizedメソッド(3.1と同じ) 
            部品の図形データをTransferableComponentにセットして、DragGestureEventのstartDragメソッドを呼ぶ 
            TransferableComponent transfer=new TransferableComponent((ShapeContainer)container.clone()); 
            e.startDrag(DragSource.DefaultCopyDrop, transfer); 
             
             | 
           
          
            | DropTargetListener | 
            
             DrawPanelにインプリメント 
            (1) dragOverメソッド 
            なにもしない 
            (2)dropメソッド 
            drop位置がComponentLibPanel上か否かチェックする。ComponentLibPanel上ならば何もせずにリターン。 
            ComponentLibPanel上でなければ、TransferableComponentにセットされた部品の図形データを取得し、ContainerManagerに書き込む。またDrop位置に図形を表示するために、図形データをDrop位置に平行移動する。ContainerManagerに書き込むとrepaint()メソッドで、DrawPanelに図形が表示される。 
              
             | 
           
          
            | MouseListener, MouseMotionListener | 
            
             何もしない。 
             | 
           
        
       
       
    
    
     
       |