2017-11-15 9 views
0

私は、内部に複数のJPanelを含むJFrameであるロック画面プログラムを作成しようとしています。各パネル(Cell)クラスにMouseMotionListenerを追加しました。ユーザーがマウスをドラッグして複数のセルにドラッグできるようにしたいと思います。 MouseEvent.GetSource(セルにキャスト)は、ドラッグが開始されたセルのみを返すという問題があります。ここに私のコードです。MouseDraggedのMouseMotionListenerコンポーネントを返すだけドラッグを開始する

public class Cell extends JPanel { 

    public String name; 

    public Cell(String name, Color color) { 
     this.name = name; 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       onMouseOver(e); 
      } 
     }); 
     setBackground(color); 
     setVisible(true); 
     repaint(); 
    } 

    private void onMouseOver(MouseEvent e) { 
     System.out.println(name); 
    } 
} 
+0

「複数のセルにドラッグする」と説明できますか? – Berger

+0

@Berger私はあるセルから別のセルにマウスをドラッグすることを意味します。 – AcePilot10

+0

あなたは、ドラッグの移動中に上に乗っていたすべてのセルを欲しいですか? – Berger

答えて

0

問題はMouseEvent.GetSourceは、(セルにキャスト)のみドラッグが正しい

から開始セルを返しているということです。すべてのイベントは、ドラッグを開始したときにクリックしたセルとの相対的なものになります。

現在あなたが現在いるセルを知りたい場合は、自分で計算する必要があります。

したがって、MouseEventからgetPoint()メソッドを使用し、終了したコンポーネントを計算することができます。

たとえば、SwingUtilities.convertPoint(...)メソッドを使用して、ポイントを親コンテナに変換することができます。

親コンテナを基準にしてポイントを取得したら、Container.findComponentAt(...)メソッドを使用して、コンテナ上の現在のコンポーネントを見つけることができます。

あなたが見つけたすべてのコンポーネントを追跡する必要があります。おそらく、コンポーネントをSetに追加してください。

または、すべてのセルにリスナーを追加するのではなく、リスナーを親パネルに追加するだけでも構いません。その後、すべてのポイントはパネルとの相対的なものになるので、ポイントを変換する必要はありません。findComponentAt(...)ロジックを実行してください。

+0

私はfindComponentAtメソッドを使用しており、それは完全に動作します!お手伝いありがとう! – AcePilot10

関連する問題