Great :) No need to change anything. 2009/11/3 <nls...@googlemail.com>
> > The problem seems to be caused by updating the scene graph by a thread > other than the Swing event dispatch thread. This is not allowed, a > solution is explained in the Piccolo2D Patterns. > > A consequence of updates by wrong threads is that PRoot discards the > update and repaint process (it checks if the right thread invoked the > update). Subsequent invalidatePaints possibly dont reach the root. > > > > Am Dienstag 03 November 2009 02:36:21 schrieb Nigel: > > The comment in PNode.java reads > > > > // When you do create you own nodes the only method that you > > will // normally need to call is invalidatePaint. This method marks > > the // nodes as having invalid paint, the root node's UI cycle will > > then > > // later discover this damage and report it to the Java repaint > > manager. > > > > > > However, I find that after calling invalidatepaint() the repaint > > manager does not discover the damage unless other events are > > occurring (such as moving the mouse around). > > > > I was expecting that calling invalidatePaint would result in the > > node being repainted some time later - am I doing something wrong > > or is Piccolo? > > > > > > Here is a contrived example (ClockNode.java) - It displays 4 custom > > nodes, each showing a clock's second hand. The top 2 clocks are > > updated from within the event dispatch thread, the lower 2 clocks > > are updated from another thread. The 2 clocks on the left are > > redrawn via a call to repaint and the 2 on the right via a call to > > invalidatePaint. > > > > if you run it you'll see the clock on the right (calling > > invalidatePaint) are only redrawn if you are moving your mouse over > > the window. > > > > ClockNode.java > > > > import java.awt.*; > > import java.awt.geom.*; > > import edu.umd.cs.piccolo.*; > > import edu.umd.cs.piccolo.util.*; > > > > import edu.umd.cs.piccolox.PFrame; > > > > public class ClockNode extends PNode { > > > > private GeneralPath secondHand; > > private int tseconds; // 10ths of seconds > > > > public void tick() { > > tseconds++; > > if ( tseconds >= 600 ) { tseconds = 0; } > > // inform Piccolo that the node needs to be redrawn > > if ( useRepaint ) { > > repaint(); > > } else { > > invalidatePaint(); > > } > > } > > > > private boolean useRepaint; > > public ClockNode(boolean useRepaint) { > > this.useRepaint = useRepaint; > > // create the needle shape > > secondHand = new GeneralPath(GeneralPath.WIND_EVEN_ODD); > > secondHand.moveTo(-0.1,0); > > secondHand.lineTo(0,1); > > secondHand.lineTo(0.1,0); > > secondHand.closePath(); > > } > > > > public void paint(PPaintContext aPaintContext) { > > Graphics2D g2 = > (Graphics2D)aPaintContext.getGraphics().create(); > > // create - as we mess with the transform > > g2.setPaint(Color.BLACK); > > //draw the face > > g2.draw( new Ellipse2D.Double( getX(), getY(), getWidth(), > > getHeight () )); > > //draw the second hand > > g2.translate(getX()+getWidth()/2,getY()+getHeight()/2); // > > translate hand so 0,0 is centre of bounds > > g2.scale(getWidth()/2,getHeight()/2); // scale the needle > > g2.rotate ( Math.toRadians((tseconds*6)/10f+180) ); > > g2.fill(secondHand); > > } > > > > public static void main(String args[]) { > > // top left clock - uses repaint > > final ClockNode clockNode1 = new ClockNode(true); > > clockNode1.setBounds(0,0,200,200); > > // top right clock - uses invalidatePaint > > final ClockNode clockNode2 = new ClockNode(false); > > clockNode2.setBounds(210,0,200,200); > > // lower left clock - uses repaint > > final ClockNode clockNode3 = new ClockNode(true); > > clockNode3.setBounds(0,210,200,200); > > // lower right clock - uses invalidatePaint > > final ClockNode clockNode4 = new ClockNode(false); > > clockNode4.setBounds(210,210,200,200); > > > > PFrame pFrame = new PFrame() { > > public void initialize() { > > > getCanvas().getLayer().addChild(clockNode1); > > > getCanvas().getLayer().addChild(clockNode2); > > > getCanvas().getLayer().addChild(clockNode3); > > > getCanvas().getLayer().addChild(clockNode4); > > setSize(500,500); > > } > > }; > > > > // tick clocks 1 and 2 in the event dispatch thread > > new javax.swing.Timer(100, new > java.awt.event.ActionListener() { > > public void actionPerformed > > (java.awt.event.ActionEvent evt) { > > clockNode1.tick(); > > clockNode2.tick(); > > } > > }).start(); > > > > // tick clocks 3 and 4 in the timer thread > > java.util.Timer timer = new java.util.Timer(true); > > timer.schedule( new java.util.TimerTask() { > > public void run() { > > clockNode3.tick(); > > clockNode4.tick(); > > } > > },0,100); > > } > > > > } > > > > > > --~--~---------~--~----~------------~-------~--~----~ Piccolo2D Developers Group: http://groups.google.com/group/piccolo2d-dev?hl=en -~----------~----~----~----~------~----~------~--~---