2012-04-28 3 views
4

Qtから来て、QGraphicsItemオブジェクトと関連して常にQGraphicsSceneを使用して、フローチャート、ゲームボードなどのものを描画します。グラフィックシーンはウィジェットであり、SwingコンポーネントのQtに相当します。これらのQGraphicsItemオブジェクトには独自のクリックハンドラがあるため、グラフィックスシーンの特定の部分のクリックは自動的に正しいグラフィックスアイテムに委譲されます。2Dグラフィックスへのオブジェクト指向のアプローチ:JPanelのクリックをペイントされたオブジェクトに委譲

私はこのワークフローをJava Swingで再現したいと考えています。これまでは手作業ですべてをペイントする方法しか見つかっていませんでした。これはクリックロジックを手動でプログラムする必要があることを意味します。それはJPanelをサブクラス化し、ここに示されているようpaintComponent関数をオーバーライドする必要:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D)g; 

    for (int row = 0; row < _numRows; ++row) { 
     for (int col = 0; col < _numCols; ++col) { 
      g2.drawRect(2 + _squareSize*col, 2 + _squareSize*row, _squareSize, _squareSize); 
     } 
    } 
} 

は、JavaのSwingは、2Dグラフィックスを描画するために類似したオブジェクト指向の方法がありますか?

+0

私はあなたがそのタイプの機能を得るために、ゲームAPI、または..JOGLなどを見ている可能性があります。 –

答えて

3

は、一般的にそれを達成するには2つの方法があります:ベースとして

  1. 使用単一のJComponentは、と(paintComponentメソッドで)その上に直接、すべてのあなたの「アイテム」を描きます。この場合、JComponentにマウス/キーリスナーを追加し、クリックした場所/ホットキーを押したときのイベントを処理することによって、すべてのマウス/キーイベントを自分で処理する必要があります。

    もう1つの方法は、任意のコンテナ(または単純なJPanel)をベースとして使用し、レイアウトを使用して他のコンポーネントを配置することです(たとえば、「null」レイアウトの場合、コンテナ内の絶対座標境界)。この場合、コンテナ内の場所によって、異なるイベントがコンポーネント内に直接渡されます(基本的には、各コンポーネントには矩形の境界があり、その上に何もない場合はすべてのイベントがそのコンポーネントに渡されますが、あなたが好きなどんな形にでも「ヒット」します)。この場合でも、チャイルドまたは標準のSwingコンポーネント(JButton、JCheckBoxなど)としてカスタムペイントコンポーネントを使用できます。

(一部画像エディタ、ペンキのようなアプリケーションやグラフィックスで動作する他のアプリケーションを作成する場合などのために)第一は時々役に立つかもしれませんが、ほとんどの場合、第二の方法は、最高です。

3

Shapeを使用してください。楕円、線、ポリゴンなどの形があります。既存のものを使用するか、Areaクラスを使用して独自のものを作成し、Shapesを組み合わせることができます。

+0

私が間違っているが、[documentation](http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html)によると、Shapeには私がフックできるフレーズ。その後、クリックされたときはどうすればわかりますか? – Pieter

+0

リスナーをパネルに追加し、クリックしたポイントがシェイプに含まれているかどうかを確認できます。 – StanislavL

+0

だから私は、パネル上のクリックを監視し、各図形の交差計算を実行した後、クリックを正しい図形に委譲しますか?それはちょっと面倒なようです。このシステムのもう1つの制限は、2つの部分的に重なった形をしているとうまくいかないことです。 – Pieter

関連する問題