線、円などを持つ JPanel があります。線をクリックすると、イベントは線イベントまたは一般的な JFrame イベントとして報告されます。ユーザーが線をクリックして移動した場合、線を移動できる必要があります。これはJava2Dで可能ですか?
4 に答える
はい。ただし、いくつかの作業を行う必要があります(java.awt.Shapeを参照)。基本的に、シェイプのリストを追跡する必要があります。JPanelは、(x、y)座標に変換できるマウスイベントを受信します。次に、Shape.contains(x、y)を呼び出して、さまざまな図形がクリックされたかどうかを確認できます。
これは、Circle、Polygon、Arcなどでうまく機能します。ただし、Line2Dの場合は簡単には機能しませんが、マウスクリックの周りに小さな長方形を付けてLine2D.intersects()を使用できます(ユーザーにクリックを強制したくないので、これも優れたUIです。正確に見えにくいピクセル上)。
「ラインイベント」のような概念は、実装することを決定しない限りありません。
幾何学模様が描かれているまたはにaMouseListener
とaMouseMotionListener
を追加することをお勧めします。'sコールバックを使用して、特定の形状がクリックされたかどうかを判別します。これを確立したら、のメソッドを使用して、マウスカーソルを移動しながら図形を移動および再描画します。Canvas
JPanel
MouseListener
mousePressed(MouseEvent)
MouseMotionListener
mouseDragged(MouseEvent)
これは、他の回答で紹介されているテクニックのいくつかを示す簡単な例です。
私は数年前に Java でキャンバス マークアップ ライブラリを作成しました。キャンバスの変換 (スケーリング、回転など) について心配する必要がない場合は、非常に簡単に作成できます。
基本的には、キャンバス シェイプのコレクションをリスト (セットではなく、Z オーダーがおそらく重要であるため) に保持する必要があります。マウス リスナーは、個々のシェイプではなく、キャンバス上にあります。コレクションの先頭に新しい項目を追加します (または後でリストを逆方向に繰り返します)。
キャンバスがマウス ダウン イベントを受け取ると、マウス座標の下にあるシェイプが見つかるまで、シェイプのコレクションを反復処理します。これを行う最も簡単な方法は、ある種の hitPoint(int x, int y) メソッドを定義するインターフェイスをシェイプに実装させることです。そうすれば、長方形で contains() を実装したり、線で intersect() またはグラフィックス パスを実行したり、ヒット パディングなどを考慮したりできます。
さらに一歩進んで、シェイプは独自の draw(Graphics2D g) メソッドを定義して、選択ボックスなどを簡単に実行できるようにするか、ペイント モードを XOR に設定してシェイプを「移動」しやすくする必要があります。キャンバスの paintComponent メソッドは、シェイプのコレクションを繰り返し処理し、各シェイプで shape.draw(g) を呼び出して、提供されたグラフィックス インスタンスを paintComponent メソッドに渡します。