java - Swing - Issue with lists not working inside paintComponent method -
i'm trying render positions of multiple fighters
onscreen. relevant code follows:
public void run() { double ns = 1000000000.0 / tps; double delta = 0; int frames = 0; int updates = 0; long lasttime = system.nanotime(); long timer = system.currenttimemillis(); while (running) { long = system.nanotime(); delta += (now - lasttime) / ns; lasttime = now; while(delta >= 1) { update(); updates++; delta--; } frame.getcontentpane().repaint(); frames++; if(system.currenttimemillis() - timer >= 1000) { timer += 1000; frame.settitle(title + " | " + updates + " ups, " + frames + " fps"); frames = 0; updates = 0; } } stop(); } private void update() { if (math.random() < .1) { fighter newfighter = new fighter(); fighterlist.add(newfighter); } } public void paintcomponent(graphics g) { super.paintcomponent(g); // paint background setbackground(color.blue); system.out.println(fighterlist.size()); (int = 0; i<fighters; i++) { system.out.println("attempted"); g.setcolor(color.green); g.drawrect((int) fighterlist.get(i).xpos, (int) fighterlist.get(i).ypos, fighterlist.get(i).radius, fighterlist.get(i).radius); system.out.println("rendered"); } } public static void main(string[] args) { game game = new game(); game.frame.setcontentpane(new game()); game.frame.setresizable(false); game.frame.setdefaultcloseoperation(jframe.exit_on_close); game.frame.setlocationrelativeto(null); game.frame.setvisible(true); game.start(); }
issue is, nothing being drawn screen. additionally, running system.out.println(fighterlist.size());
gives different outputs based on it's run - when run inside paintcomponent
returns zero, wheras when run inside update
returns proper amount. issue scope, or there else i'm missing?
most synchronization issue. paintcomponent()
method called edt (event dispatch thread) while run()
method runs in own separate thread. update()
gets called adds new fighter
s list.
you need proper synchronization both (or all) threads see same consistent data.
also since model (data) may modified during repaint, should "clone" model avoid inconsistent model being painted. or if don't want clone it, synchronize access model can't modified while painted.
Comments
Post a Comment