Проблема, с которой я столкнулся, было трудно воспроизвести, но я надеюсь, что кто-то здесь может дать мне подсказку, как ее решить.
Я написал ComponentProvider<JLabel>
, который принимает значение String и создает интерактивную ячейку, украшенную значком, если String содержит URL-адрес. Если в значении String не найден URL-адрес, то для метки не задан значок, и ячейка не должна быть активной.
Вот код:
public class ExternalLinkProvider extends ComponentProvider<JLabel> implements RolloverRenderer {
private String url = null;
@Override
protected void format(CellContext context) {}
@Override
protected void configureState(CellContext context) {
if (context.getValue() instanceof String) {
String stringValue = (String) context.getValue();
WwwLink link = new WwwLink(stringValue);
// If this contains a valid Url, set a link icon.
if (link.isValid()) {
rendererComponent.setIcon(ExternalLink.WWW_LINK_ICON);
url = link.getUrl();
} else {
rendererComponent.setIcon(null);
url = null;
}
rendererComponent.setText(link.getString());
}
}
@Override
protected JLabel createRendererComponent() {
return new JRendererLabel();
}
@Override
public boolean isEnabled() {
return url != null;
}
@Override
public void doClick() {
if (url != null) {
// Follow the url
}
}
}
Это выглядит так:
Первая ячейка должна быть доступна для перехода по ссылке, которая была в строковом значении и была удалена из отображаемого текста. Вторая ячейка не содержала ссылки в тексте и поэтому не должна быть кликабельной.
Однако в этом случае обе ячейки не кликабельны, и если я сохраняю строковое значение и распечатываю его на консоли из метода isEnabled()
, я вижу, что текст из второй ячейки всегда печатается независимо от того, навожу ли я курсор на первую или на вторая ячейка.
Это единственная ситуация, когда я заметил такое поведение. Я знаю, что один экземпляр Provider повторно используется для каждой ячейки, содержащей этот тип, но по какой-то причине RolloverRenderer, похоже, не перенастраивает этот Provider должным образом в этом случае.
Я делаю что-то не так здесь?