private void refresh(boolean keepPerspective) {
		FGData functionGraphData = controller.getFunctionGraphData();
		if (functionGraphData.hasResults()) {
			//
			// We use the graph's data over the 'currentXXX' data, as there is a chance that the
			// latter values have been set to new values, while the graph has differing data.  In
			// that case we have made the decision to prefer the graph's data.
			//
			Function function = functionGraphData.getFunction();
			Address address = function.getEntryPoint();
			Address currentAddress = currentLocation.getAddress();
			if (function.getBody().contains(currentAddress)) {
				// prefer the current address if it is within the current function (i.e., the
				// location hasn't changed out from under the graph due to threading issues)
				address = currentAddress;
			}

			Program program = function.getProgram();
			ProgramLocation programLocation = new ProgramLocation(program, address);
			controller.rebuildDisplay(program, programLocation, keepPerspective);
			return;
		}

		controller.rebuildDisplay(currentProgram, currentLocation, keepPerspective);
	}
Tells this provider to refresh, which means to rebuild the graph and relayout the vertices.
Ghidra/Features/FunctionGraph/src/main/java/ghidra/app/plugin/core/functiongraph/FGProvider.java