Hi Ryan, I've created an issue for that. https://github.com/TestFX/TestFX/issues/231
Will try you example out. --Benjamin On Tue, Sep 29, 2015 at 2:58 AM, Ryan Jaeb <r...@jaeb.ca> wrote: > Hi Benjamin, > > Yes, it's a NoNodesFoundException using TestFX 3.1.2. > > As far as I know, using firePulse() is the only way to guarantee all > previous model changes are rendered in the scene. I've created an example > to show what I mean: > > https://gist.github.com/ryanjaeb/74685a002e2b402e7fac > > It's a small example, so I'll post it inline too: > > ... > public class FirePulseApplication extends Application { > @Override > public void start(Stage primaryStage) throws Exception { > printEnv(); > > ListView<String> listView = new ListView<>(); > > Scene scene = new Scene(listView, 200, 400); > primaryStage.setScene(scene); > primaryStage.show(); > > for (int i = 1; i < 6; i++) { > listView.getItems().add("list-item-" + i); > } > > System.out.println("Before firePulse():"); > printVisibleRowInfo(listView); > > Toolkit.getToolkit().firePulse(); > > System.out.println("After firePulse():"); > printVisibleRowInfo(listView); > > Platform.exit(); > } > > private void printVisibleRowInfo(ListView<?> listView) { > // Item count according to the list model > System.out.println(" Item count: " + listView.getItems().size()); > > // Extract the VirtualFlow so it can be used to determine which > // list items are rendered in the scene. > ObservableList<Node> children = listView.getChildrenUnmodifiable(); > VirtualFlow<?> flow = (VirtualFlow<?>) children.get(0); > > IndexedCell<?> firstCell = flow.getFirstVisibleCell(); > System.out.println(" First visible cell: " + firstCell); > > IndexedCell<?> lastCell = flow.getLastVisibleCell(); > System.out.println(" Last visible cell: " + lastCell); > } > > private void printEnv() { > String osName = System.getProperty("os.name"); > String jvm = System.getProperty("java.version") + > " (" + System.getProperty("java.vm.version") + > " - " + System.getProperty("os.arch") + ")"; > > System.out.println("OS: " + osName); > System.out.println("JVM: " + jvm); > System.out.println(""); > } > } > ... > > The output I get when running the example: > > ... > OS: Windows 8.1 > JVM: 1.8.0_40 (25.40-b25 - amd64) > > Before firePulse(): > Item count: 5 > First visible cell: null > Last visible cell: null > After firePulse(): > Item count: 5 > First visible cell: ListViewSkin$2@7820053f[styleClass=cell > indexed-cell list-cell]'list-item-1' > Last visible cell: ListViewSkin$2@8be9262[styleClass=cell indexed-cell > list-cell]'list-item-5' > ... > > Until there's a pulse, the nodes that represent the list items don't > exist, so the NoNodesFoundException is expected. > > Ryan > > On Sun, Sep 27, 2015 at 12:40 AM, Benjamin Gudehus <hasteb...@gmail.com> > wrote: > >> Hi Ryan! >> >> >Otherwise the drag(...) command will throw an exception because it >> can't find the node for "list-item-name" (it doesn't exist yet). >> >> Well, this is very interesting. This must be a NoNodesFoundException in >> TestFX 3. >> >> >I don't actually needto call firePulse(). I just need a way to know the >> scene is up to date with a re-validated model. Is there a better way of >> accomplishing that right now? >> >> TestFX should try to find the Node within the JavaFX Application Thread >> using Platform.runLater(...). Maybe this is a better way than to call >> firePulse(), >> >> --Benjamin >> >> On Thu, Sep 24, 2015 at 12:49 PM, Ryan Jaeb <r...@jaeb.ca> wrote: >> >>> I use firePulse() in GUI test code. I'm using TestFX (v3) for testing. >>> Is >>> there a way to ensure model updates are reflected in the scene without >>> using firePulse()? Consider something like this: >>> >>> ... >>> // TestFX starts us on the main thread. Maybe I'm using it wrong? >>> >>> CountDownLatch latch = new CountDownLatch(1); >>> >>> Platform.runLater(() -> { >>> // Add "list-item-name" to an empty list that's used as the model for >>> // a ListView. >>> Toolkit.getToolkit().firePulse(); >>> latch.countDown(); >>> }); >>> >>> try { >>> latch.await(1, TimeUnit.SECONDS); >>> } >>> catch (InterruptedException e) { >>> throw new RuntimeException(e); >>> } >>> >>> // TestFX runs this on the application thread. >>> drag("list-item-name").to("trash"); >>> >>> assertTrue(list.isEmpty); >>> ... >>> >>> In a case like the above, firePulse() is used to ensure a node (ListCell) >>> for "list-item-name" is added to the scene before continuing with the >>> test. Otherwise the drag(...) command will throw an exception because it >>> can't find the node for "list-item-name" (it doesn't exist yet). >>> >>> I don't actually needto call firePulse(). I just need a way to know the >>> scene is up to date with a re-validated model. Is there a better way of >>> accomplishing that right now? >>> >>> Ryan >>> >>> >>> On Wed, Sep 23, 2015 at 5:49 PM, Jonathan Giles < >>> jonathan.gi...@oracle.com> >>> wrote: >>> >>> > Hi all, >>> > >>> > Today I am keen to get your help on understanding use of the >>> > Toolkit.getToolkit().firePulse() private API. If you could spare a few >>> > minutes to grep your source directory for any usage of 'firePulse', and >>> > email me your findings, that would be really interesting. >>> > >>> > As a gentle motivational tool I'll conclude by saying that, >>> surprisingly, >>> > this private API is barely used inside the openjfx production code. If >>> you >>> > look at the openjfx unit tests, it is used massively. The question is >>> - how >>> > much is this being used by other community members. If the answer is >>> 'not >>> > much' or less, then this private API may not be made public in JDK 9. >>> Your >>> > feedback therefore is critical! >>> > >>> > Thanks, >>> > -- Jonathan >>> > >>> >> >> >