我已经将Swingx的ComponentProvider子类化为提供JButton,但在我的JXTreeTable的某些行上,我不想显示任何按钮。我想要的最终“结果”是一个空单元格,就像我在列中显示空文本时所得到的那样,我还没有设置提供者。
是否可以在某些行上隐藏渲染的组件(例如,取决于值)?在setVisible(false)
或format()
中的已呈现组件上设置configureState()
不起作用。
是否可以将ComponentProvider子类化以提供不同类型的组件?如果是,那将如何运作?
我在哪里可以找到ComponentProvider提供的可能性的一些示例,以及对哪种方法做什么的明确解释(例如,我很难理解configureState()
和format()
之间的区别)
修改
是否可以防止JX(树)中显示的JButton?表格与单元格一样宽?
如果我创建另一个荧光笔,我可以使用另一个谓词(ROLLOVER或其他东西)来更改光标吗?即使按钮被隐藏,光标也会变为手(通过链接)。
非常感谢!
答案 0 :(得分:2)
有趣: - )
一个片段,就像概念验证一样
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);
}
}
));
另一方面,提供程序不是插入自定义上下文相关配置的地方。这应该在荧光笔中完成,如f.i.在
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中)去除那个间距(wrappedProvider最初是用于JXTree,默认情况下没有安装,因为ComponentOrientation仍然存在问题)。
(问题中的2个)不受支持,componentProvider旨在返回在每次调用时配置了完全相同属性的相同单个组件
(问题中有3个)咳嗽......不,只是来源和示例(在演示和测试包中)
修改(回答问题的编辑部分)
不,使用当前的WrappingIconpPanel:它确实使用了Borderlayout - 我们都知道:-)不尊重最大尺寸。使用BoxLayout会遇到我不完全记得的问题。然而,这将是调整的地方,以便按钮的最大值得到尊重
嗯...不完全确定你是如何实现光标更改的。假设它在你的ButtonProvider中:实现isRolloverEnabled以返回true / false,具体取决于它是否可见 Edit-in-Edit 不起作用。不知道为什么,这可能是WrappingProvider中翻转 - 检测和/或处理中的错误
现在关闭周末: - )