我遇到了将对象中的多个图像绘制到自定义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);
}
答案 0 :(得分:2)
我相信,添加更多对象只会在另一个Image上绘制,因为它们使用相同的Graphics2D对象。
问题不在于您使用相同的Graphic对象。给定帧上的所有Swing组件都使用相同的Graphics对象绘制。如果它们在彼此之上绘制,那么这是因为您没有为每个对象指定正确的x / y位置。
所以我决定创建一个包含Shapes的自定义JComponent
这是一个很好的方法。但是,在这种情况下,您始终会在组件的位置(0,0)处绘制对象。然后,您将通过在组件上调用setLocation(...)
来定位每个组件。
您还需要覆盖组件的getPreferredSize()方法,以确保它返回组件的适当大小。
您发布的示例代码存在输入错误。摆脱super.paintComponents(g)上的“s”。