我遇到的问题很难重现,但我希望这里有人可以给我一个关于如何解决这个问题的提示。
我编写了一个ComponentProvider<JLabel>
接受字符串值的方法,如果字符串包含 URL,则创建一个装饰有图标的可点击单元格。如果在字符串值中未找到 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。
我在这里做错了吗?