4

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

このワークフローをJavaSwingで複製したいと思っています。これまでのところ、すべてを手動でペイントする方法しか見つけていません。これは、クリックロジックを手動でプログラムする必要があることも意味します。次に示すように、 aをサブクラス化し、関数を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グラフィックスを描画するための同様のオブジェクト指向の方法がありますか?

4

2 に答える 2

3

を使用しShapeます。楕円形、線、多角形などの形があります。既存のものを使用することも、Areaクラスと組み合わせを使用して独自のものを作成することもできますShapes

于 2012-04-28T12:15:38.937 に答える
3

一般に、これを実現するには2つの方法があります。

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

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

ほとんどの場合、2番目の方法が最適ですが、1番目の方法が役立つ場合もあります(たとえば、画像エディタ、ペイントのようなアプリケーション、またはグラフィックスで動作するその他のアプリケーションを作成する場合)。

于 2012-04-28T12:30:33.800 に答える