将多个图像绘制到jpanel

时间:2013-04-30 00:41:59

标签: java swing jpanel jcomponent

我遇到了将对象中的多个图像绘制到自定义JPanel上的问题。我已经能够在JPanel上成功绘制一个对象的图像表示。我相信,添加更多对象仅在另一个Image上绘制,因为它们使用相同的Graphics2D对象。

所以我决定创建一个包含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使用矩形来检查用户是否单击了图像,并使用圆圈确定它是否与另一个矩形相交以进行战斗。这两个形状在图像下绘制为不透明。

然后,自定义JPanel使用此for循环将它们添加到面板:

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

1 个答案:

答案 0 :(得分:2)

  

我相信,添加更多对象只会在另一个Image上绘制,因为它们使用相同的Graphics2D对象。

问题不在于您使用相同的Graphic对象。给定帧上的所有Swing组件都使用相同的Graphics对象绘制。如果它们在彼此之上绘制,那么这是因为您没有为每个对象指定正确的x / y位置。

  

所以我决定创建一个包含Shapes的自定义JComponent

这是一个很好的方法。但是,在这种情况下,您始终会在组件的位置(0,0)处绘制对象。然后,您将通过在组件上调用setLocation(...)来定位每个组件。

您还需要覆盖组件的getPreferredSize()方法,以确保它返回组件的适当大小。

您发布的示例代码存在输入错误。摆脱super.paintComponents(g)上的“s”。