Java 将多个图像绘制到jpanel

Java 将多个图像绘制到jpanel,java,swing,jpanel,jcomponent,Java,Swing,Jpanel,Jcomponent,我在将多个图像从对象绘制到自定义JPanel时遇到问题。我已经能够在JPanel上成功地绘制一个对象的图像表示。我相信,添加更多的对象只会在另一个图像上绘制,因为它们使用相同的Graphics2D对象 因此,我决定创建一个包含形状、图像和对象的自定义JComponent,但不幸的是,它没有更好的效果。我的想法是,这将允许JPanel为每个对象使用for循环,并创建一个新的Graphics2D对象进行绘制 这是我正在编程的游戏,仅供参考。我试图绘制的对象是屏幕上需要操纵的单位 public cla

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

因此,我决定创建一个包含形状、图像和对象的自定义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);
    }
我相信,添加更多的对象只会在另一个图像上绘制,因为它们使用相同的Graphics2D对象

问题不是因为您使用了相同的图形对象。给定框架上的所有Swing组件都使用相同的图形对象绘制。如果它们相互重叠,那是因为没有为每个对象指定适当的x/y位置

所以我决定创建一个包含这些形状的自定义JComponent

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

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


您发布的示例代码有一个键入错误。去掉super.paintComponents(g)上的“s”。

“添加更多对象仅在其他图像上绘制,…”
是的,这是预期的行为。你想要达到什么不同的行为?我在你的问题里找不到这个。还请注意,您正在创建多个Graphics2D变量,但它们都引用同一图形对象,因此这样做不会产生任何效果。你熟悉对象和引用变量之间的区别吗?因为这是一个非常重要的区别,并且触及了Java的核心?我现在还是一个新手,所以我对Swing的大部分知识都来自于反复试验和在线回顾示例实现。在我看来,当我试图使用图形g中相同的图形2D时,我无法在屏幕上获得任何图像。因此,我假设需要为我需要的每个图像创建一个新的Graphics2D变量。我正在努力完成的是能够绘制一个船舶的图像和形状,它将处理面板中每个船舶的鼠标事件和交点。然而,到目前为止,我只能得到一张图片。你的假设是非常不正确的。您确实需要转到Swing图形教程。你只是把代码扔到墙上,看看有没有代码粘在墙上,这是学习这门难学的课程的一个糟糕的计划。在教程中向专业人士学习。你指的是什么教程?在哪里可以找到它们?这些:1)、2)、3)和4)。我想我理解了。我需要为每个对象添加一个X,Y位置,以便图形对象可以引用该位置并跟踪每个船舶的位置。通过这种方式,玩家可以独立移动船只,因为船只对象将被用作其在屏幕上位置的逻辑。这听起来更好吗?谢谢你的反馈!