private boolean refreshByteValues(TaskMonitor monitor, List<MemoryMatch> matches) {
			try {
				byteSource.invalidate();	// clear any caches before refreshing byte values
				monitor.initialize(matches.size(), "Refreshing...");
				for (MemoryMatch match : matches) {
					byte[] bytes = new byte[match.getLength()];
					byteSource.getBytes(match.getAddress(), bytes, bytes.length);
					match.updateBytes(bytes);
					monitor.incrementProgress();
					if (monitor.isCancelled()) {
						return false;
					}
				}
				return true;
			}
			catch (Throwable t) {
				// Catch any runtime errors so that we exit task gracefully and don't leave
				// the provider in a stuck "busy" state.
				Msg.showError(this, null, "Unexpected error refreshing bytes", t);
			}
			return false;
		}
Internal panel of the memory search window that manages the display of the search results
in a table. This panel also includes most of the search logic as it has direct access to the
table for showing the results.
Ghidra/Features/Base/src/main/java/ghidra/features/base/memsearch/gui/MemorySearchResultsPanel.java