Java Swing:图形组件仅出现在左上角区域

Java Swing:图形组件仅出现在左上角区域,java,swing,graphics,jpanel,display,Java,Swing,Graphics,Jpanel,Display,我目前正在尝试用Java实现一个简单的动画。 我有一个面板,我想在其中打印一个BuffereImage。我将图像位置设置为一个点,并设置其尺寸 但是,就好像我将图像的“打印区域”及其尺寸放置在左上角,并且仅绘制属于该打印区域的图像部分,如下图所示: 我想这可能是我缺少的一个基本东西,但是我找不到任何与我的问题对应的答案,我是java的初学者,所以 以下是我的代码中与此问题相关的部分: public abstract class ObjetAnime extends JPanel{ protec

我目前正在尝试用Java实现一个简单的动画。 我有一个面板,我想在其中打印一个BuffereImage。我将图像位置设置为一个点,并设置其尺寸

但是,就好像我将图像的“打印区域”及其尺寸放置在左上角,并且仅绘制属于该打印区域的图像部分,如下图所示:

我想这可能是我缺少的一个基本东西,但是我找不到任何与我的问题对应的答案,我是java的初学者,所以

以下是我的代码中与此问题相关的部分:

public abstract class ObjetAnime extends JPanel{
protected Point location;
protected Dimension dim;
protected BufferedImage picture;

ObjetAnime(ObjetsPropriete objetProp) 
{
    location = new Point(10,10);
    dim = objetProp.getDimension();
    try {
        picture = ImageIO.read(new File(objetProp.getPath()));
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    this.setSize(dim);
    this.setLocation(location);
    this.setLayout(null);
    this.setOpaque(false);
}

@Override
protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  if (picture != null) {
     g.drawImage(picture, location.x, location.y, this);
  }
}
在超级课堂上,我有:

public ListeObjets(GConfig gconfig, GPanel jeuPanel)
{
    setListeObjets(new ArrayList<ObjetAnime>());
    panel = jeuPanel;
    for( int i = 0; i < gconfig.getObjetsTab().length; ++i)
    {
        switch(gconfig.getObjetsTab()[i].getType())
        {
            case ROND:
                getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
            break;
        }
    }
    addToPanel(panel);
}

public void addToPanel(GPanel jeuPanel) {
    jeuPanel.setLayout(null);
    Iterator iterator = getListeObjets().iterator();
    ObjetAnime obj = (ObjetAnime) iterator.next();
    jeuPanel.add(obj, obj.location);
    while(iterator.hasNext())
    {
        obj = (ObjetAnime) iterator.next();
        jeuPanel.add(obj, obj.location);
    }   
    System.out.println(obj);

}
非常感谢,祝你度过愉快的一天

location = new Point(10,10);
所有的对象都有一个(10,10)的位置,所以我猜它们指向彼此的上方。所以别再提那句话了

jeuPanel.add(obj, obj.location);
第二个参数对add(…)方法没有任何意义。它不指定零部件的位置。去掉第二个参数

(如果我理解您的代码)并且您希望指定位置,则需要执行以下操作:

//getListeObjets().add(new Rond(gconfig.getObjetsTab()[i]));
Rond rond = new Rond(gconfig.getObjetsTab()[i]);
rond.setLocation(32*i, 32*i);
getListeObjets().add(rond);
上面的代码将在面板中对角放置每个对象


关键是您需要将每个组件设置为一个唯一的位置。

谢谢您的回答,正因为如此,我找到了解决问题的方法

protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  if (picture != null) {
     g.drawImage(picture, 0, 0, this);
  }
}
问题的原因是在objectLocation使用drawImage,而在指定位置对对象本身进行drawImage打印

protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  Graphics2D g2 = (Graphics2D) g;
  g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

  if (picture != null) {
     g.drawImage(picture, 0, 0, this);
  }
}