从列表<>呈现排列

时间:2012-10-20 07:57:31

标签: java image swing graphics


我试图从列表数组渲染到JPanel。我已经创建了自己的2D渲染器,但是当我尝试使用RenderAdd函数添加到列表时,它不会添加,或者列表数组不允许读取列表... 他是启动它的代码。

JFrame frame = new JFrame();
    frame.setSize(900, 500);
    frame.setVisible(true);
    Render render = new Render(new RenderDimension(frame.getX(),frame.getY(),frame.getWidth(),frame.getHeight()), frame);
    BufferedImage zombie = new ImageLoader().readImage("zombie");
    BufferedImage player = new ImageLoader().readImage("player");
    render.RenderAdd(new RenderImage(new RenderDimension(100, 100, player.getWidth(), player.getHeight()), player));
    render.RenderAdd(new RenderImage(new RenderDimension(0, 0, zombie.getWidth(), zombie.getHeight()), zombie));
    render.start();
    render.RenderAdd(new RenderImage(new RenderDimension(200, 100, player.getWidth(), player.getHeight()), player));

'render'是渲染部分中的主要Render类。然后,RenderAdd添加一个RenderImage,它具有RenderDimension,它是对象的x和y,以及图像的宽度和高度。然后还将BufferedImage作为参数。

虽然每次我尝试运行程序时都会出现空白屏幕

现在,在Render类中,还有另一个扩展线程的类。这是将帧作为参数,删除内容并开始绘制到getContentPane()的类。下一个代码位于renderthread类的paintComponent()函数内。 不幸的是,什么都没有画,但确实有效,因为我尝试过使用System.out.print(“h”)重复打印自己。

for (RenderImage r : render.getList()){
    int x = r.getSize().getX();
    int y = r.getSize().getY();
    int wi = r.getSize().getWidth();
    int hi = r.getSize().getHeight();
    if (x + wi >= -1 && x + wi <= d.getWidth()){
        if (y + hi >= -1 && y + hi <= d.getHeight()){
            g.drawImage(r.getImage(), x, y, null);
        }
    }
}
frame.getContentPane().add(p);
frame.getContentPane().validate();
frame.getContentPane().repaint();

我认为问题是列表不会添加,所以这就是那部分。

List<RenderImage> render = new ArrayList<RenderImage>();

public List<RenderImage> getList(){
    return render;
}

public void RenderAdd(RenderImage renders){
    render.add(renders);
}

1 个答案:

答案 0 :(得分:3)

使用您提供的示例代码很难知道。

场景#1,覆盖JComponent#paintComponent

如果您在paintComponent方法

中执行此操作
for (RenderImage r : render.getList()){
    int x = r.getSize().getX();
    int y = r.getSize().getY();
    int wi = r.getSize().getWidth();
    int hi = r.getSize().getHeight();
    if (x + wi >= -1 && x + wi <= d.getWidth()){
        if (y + hi >= -1 && y + hi <= d.getHeight()){
            g.drawImage(r.getImage(), x, y, null);
        }
    }
}
frame.getContentPane().add(p);
frame.getContentPane().validate();
frame.getContentPane().repaint();

然后DON`T。

调用任何以paint方法内的任何方式更新UI的方法只会导致灾难。这只是触发另一个重新绘制请求添加到事件调度线程,它将调用您paintComponent方法,您可以说出您的CPU和程序响应。

此外,请确保在使用其他Thread其他信息系统更新用户界面时,请务必使用SwingUtilities#invokeLaterSwingUtilities.invokeAndWait

另外,请确保拨打super.paintComponent

场景#2,使用JComponent#getGraphics

我想到的问题是,g来自你的例子。

如果您使用JComponent#getGraphics,请不要。这是重绘之间图形的简单快照,一旦下一次重绘发生,它就会被删除。

JPanel之类的内容创建自定义组件并覆盖它的paintComponent方法,并使用RenderImage循环更新组件(只需省略更改UI的代码)

此外,请确保所有重新绘制请求都来自EDT上下文