@Nonnull
	private GridPane createPane(@Nonnull String suffix, @Nonnull UpdateHandler versionAction) {
		GridPane layout = new GridPane(8, 8);
		Label labelVersion = new BoundLabel(getBinding("java.targetversion"));
		VersionComboBox versionCombo = new VersionComboBox();
		ProgressBar progressBar = new ProgressBar(0);
		Button applyButton = new ActionButton(RUN, getBinding("menu.edit.changeversion." + suffix), () -> {
			versionCombo.setDisable(true);
			int targetVersion = versionCombo.getValue();
			CompletableFuture.supplyAsync(() -> versionAction.accept(targetVersion, progress -> {
				// Update progress bar when the handler reports progress
				FxThreadUtil.run(() -> progressBar.setProgress(progress));
			})).whenCompleteAsync((count, error) -> {
				if (error == null) {
					// Done with upgrade/downgrade, close the window
					logger.info("Changed {} classes to target version {}", count, targetVersion);
					hide();
				} else {
					logger.error("Failed to change class target version to {}", targetVersion, error);
				}
			}, FxThreadUtil.executor());
		});
		applyButton.disableProperty().bind(versionCombo.disabledProperty());

		versionCombo.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
		applyButton.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
		progressBar.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

		layout.add(labelVersion, 0, 0);
		layout.add(versionCombo, 1, 0);
		layout.add(applyButton, 0, 2, 2, 1);
		layout.add(progressBar, 0, 3, 2, 1);
		layout.setPadding(new Insets(10));
		layout.setAlignment(Pos.TOP_CENTER);
		return layout;
	}
Popup for initiating the upgrading or downgrading of all classes.

@author Matt Coley
recaf-ui/src/main/java/software/coley/recaf/ui/control/popup/ChangeClassVersionForAllPopup.java