@Override
		public Component getTableCellRendererComponent(GTableCellRenderingData data) {
			BundleStatus status = (BundleStatus) data.getRowObject();
			ResourceFile file = (ResourceFile) data.getValue();
			JLabel label = (JLabel) super.getTableCellRendererComponent(data);
			label.setText(Path.toPathString(file));
			GhidraBundle bundle = bundleHost.getGhidraBundle(file);
			if (bundle == null || bundle instanceof GhidraPlaceholderBundle || !file.exists()) {
				label.setForeground(COLOR_BUNDLE_ERROR);
				return label;
			}

			if (data.isSelected()) {
				return label; // use default selection colors
			}

			if (status.isBusy()) {
				label.setForeground(COLOR_BUNDLE_BUSY);
			}
			else if (!status.isEnabled()) {
				label.setForeground(COLOR_BUNDLE_DISABLED);
			}
			else if (status.isActive()) {
				label.setForeground(COLOR_BUNDLE_ACTIVE);
			}
			else {
				label.setForeground(COLOR_BUNDLE_INACTIVE);
			}

			return label;
		}
when bundles are added or removed, update the table.
when bundles change enablement or activation, update rows.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/osgi/BundleStatusTableModel.java