我试图从列表数组渲染到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);
}
答案 0 :(得分:3)
使用您提供的示例代码很难知道。
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#invokeLater
或SwingUtilities.invokeAndWait
另外,请确保拨打super.paintComponent
JComponent#getGraphics
我想到的问题是,g
来自你的例子。
如果您使用JComponent#getGraphics
,请不要。这是重绘之间图形的简单快照,一旦下一次重绘发生,它就会被删除。
从JPanel
之类的内容创建自定义组件并覆盖它的paintComponent
方法,并使用RenderImage
循环更新组件(只需省略更改UI的代码)
此外,请确保所有重新绘制请求都来自EDT上下文