有趣的 :-)
- 通常不起作用,因为 CellRendererPane 不尊重组件的可见属性 - 它总是标记它。但是:如果将其包装到 WrappingProvider 中的实际提供程序然后将该包装器的组件设置为不可见,则可以在 SwingX 中工作。
一个片段,就像概念验证一样
table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
@Override
protected void configureState(CellContext context) {
super.configureState(context);
rendererComponent.getComponent().setVisible(context.getRow() != 5);
}
}
));
另一方面,提供程序不是插入自定义上下文相关配置的地方。这应该在荧光笔中完成,如 fi in
AbstractHighlighter highlighter = new AbstractHighlighter(HighlightPredicate.EVEN) {
@Override
protected Component doHighlight(Component component,
ComponentAdapter adapter) {
((WrappingIconPanel) component).getComponent().setVisible(false);
return component;
}
@Override
protected boolean canHighlight(Component component,
ComponentAdapter adapter) {
return component instanceof WrappingIconPanel;
}
};
table.addHighlighter(highlighter);
哪个不能按预期工作(按钮始终隐藏),因为它不是保证在提供程序中重置的属性之一。没有什么可以阻止自定义提供商扩展这些保证,例如
table.getColumn(1).setCellRenderer(new DefaultTableRenderer(
// custom wrappingProvider which guarantees the reset of visible
// property of the wrapped component
new WrappingProvider(IconValues.NONE, new ButtonProvider(), false) {
@Override
protected void configureState(CellContext context) {
super.configureState(context);
rendererComponent.getComponent().setVisible(true);
}
}
));
现在荧光笔可以根据上下文无所畏惧地更改可见内容。一个轻微的视觉故障: WrappingIconPanel 总是为图标留出一些空间,即使没有 - 不太确定为什么会发生这种情况,或者删除该空间是否安全(在 SwingX 中)(wrappingProvider 最初是用于JXTree,默认情况下没有安装它,因为 ComponentOrientation 仍然存在问题)。
(问题中的 2)不支持,componentProvider 旨在返回相同的单个组件,该组件在每次调用时配置了完全相同的属性
(问题中的 3)咳嗽......不,只有来源和示例(在演示和测试包中)
编辑(回答问题的已编辑部分)
不,使用当前的 WrappingIconpPanel:它确实使用了 Borderlayout - 我们都知道:-) 不尊重最大尺寸。使用 BoxLayout 会但有一些我不完全记得的问题。尽管如此,这将是调整的地方,以便尊重按钮的最大值
嗯...不完全确定您是如何实现光标更改的。假设它在您的 ButtonProvider 中:实现 isRolloverEnabled 以返回 true/false,具体取决于它是否可见Edit-in-Edit不起作用。不知道为什么,可能是翻转检测和/或 WrappingProvider 处理中的错误
现在进入周末:-)