-1

オブジェクトからカスタム JPanel に複数の画像を描画する際に問題が発生しています。JPanel 上のオブジェクトの 1 つのイメージ表現を正常に描画できました。オブジェクトを追加しても、同じ Graphics2D オブジェクトを使用するため、他の Image の上にペイントするだけだと思います。

そこで、Shapes、Image、および Object を含むカスタム JComponent を作成することにしましたが、残念ながらうまく機能しません。私の考えでは、これにより、JPanel が各オブジェクトに対して for ループを使用し、ペイントする新しい Graphics2D オブジェクトを作成できるようになると考えました。

これは、私がプログラミングしているゲーム用です。参考までに。私がペイントしようとしているオブジェクトは、操作する必要がある画面上のユニットです。

public class ShipGraphic extends JComponent{

private Shape       shipShape, combatShape;
private Image       shipImage;
private ImageIcon   si;
private int         shipX = 0, shipY = 0, shipW, shipH, combatH, combatW, combatR;
private Ship        ship;

public ShipGraphic(Ship ship)
{
    this.ship = ship;
    setImageIcon();
    shipImage = si.getImage();
    shipW = shipImage.getWidth(null);
    shipH = shipImage.getHeight(null);
    combatH = shipH * 2;
    combatW = shipW * 2;
    combatR = -(shipW * 2);
    shipShape = new Rectangle2D.Double(shipX, shipY, shipW, shipH);
    combatShape = new Ellipse2D.Double(combatR, combatR, combatW, combatH);
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponents(g);

    Graphics2D g2 = (Graphics2D) g;
    Graphics2D g3 = (Graphics2D) g;
    Graphics2D g4 = (Graphics2D) g;

    g2.drawImage(shipImage, shipX, shipY, null);
    g3.setColor(new Color(0,0,0,0));
    g3.drawRect(shipX, shipY, shipW, shipH);
    g4.draw(combatShape);
}

ShipGraphic は Rectangle を使用してユーザーが画像をクリックしたかどうかを確認し、Circle を使用して戦闘用の別の四角形と交差するかどうかを判断します。これらの 2 つの形状は、イメージの下に不透明に描画されます。

カスタム JPanel は、次の for ループを使用してそれらをパネルに追加します。

    for ( Ship s : sector.getShips() )
    {
        ShipGraphic ship = new ShipGraphic(s);
    }
4

1 に答える 1

2

オブジェクトを追加しても、同じ Graphics2D オブジェクトを使用するため、他の Image の上にペイントするだけだと思います。

問題は、同じ Graphic オブジェクトを使用しているからではありません。特定のフレーム上のすべての Swing コンポーネントは、同じ Graphics オブジェクトでペイントされます。それらが互いの上にペイントされる場合、それは各オブジェクトに適切な x/y 位置を指定していないためです。

そこで、Shapes を含むカスタム JComponent を作成することにしました。

それは良いアプローチです。ただし、この場合、常にコンポーネントの位置 (0, 0) にオブジェクトをペイントします。次に、コンポーネントを呼び出しsetLocation(...)て各コンポーネントを配置します。

コンポーネントの getPreferredSize() メソッドをオーバーライドして、コンポーネントの適切なサイズが返されるようにする必要もあります。

投稿したサンプルコードにはタイプミスがあります。super.paintComponents(g) の「s」を取り除きます。

于 2013-04-30T01:51:19.873 に答える