Java Swing : Graphic component only appears in top-left corner zone

标签 java swing graphics jpanel display

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

然而,就好像我将图像的“打印区域”及其尺寸放在左上角,并且只有属于该打印区域的图像部分被绘制,如下图所示图片:

http://i.stack.imgur.com/CRmCv.png

我想这可能是我缺少的一个基本的东西,但是我找不到与我的问题相对应的任何答案,而且我是 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);
  }
}

在父类(super class)中我有:

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);

}

对象属性是:

public ObjetsPropriete()
{
    path = new String("./Images/Boule.png");
    dim = new Dimension(32,32);
    type = Objet.ROND;
}

非常感谢,祝您有愉快的一天!

最佳答案

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);

以上代码会将每个对象沿对角线放置在面板中。

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

关于Java Swing : Graphic component only appears in top-left corner zone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37365024/

相关文章:

java - 自动滚动 JScrollPane 令人不安

java - JTable 和 DefautlTableModel 不刷新

graphics - 为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?

java - 将多个图像合并为一个图像以供以后绘画,使用 alpha 混合

Java TreeMap Nested ,clear 删除所有数据,而 new 则不

java - 通用开源 REST 客户端?

java - 我不知道为什么我的代码中的计时器使动画复制其 repaint() 位置

java - 使用多个相同的方法和时间复杂度

java - 如何在 Java 项目中构建我的类

python - 在 Shady 中呈现预先准备好的图像阵列的一部分