Swingx组件提供程序:隐藏某些行上的组件

时间:2012-02-16 12:42:41

标签: java swing swingx jxtable jxtreetable

我已经将Swingx的ComponentProvider子类化为提供JButton,但在我的JXTreeTable的某些行上,我不想显示任何按钮。我想要的最终“结果”是一个空单元格,就像我在列中显示空文本时所得到的那样,我还没有设置提供者。

  1. 是否可以在某些行上隐藏渲染的组件(例如,取决于值)?在setVisible(false)format()中的已呈现组件上设置configureState()不起作用。

  2. 是否可以将ComponentProvider子类化以提供不同类型的组件?如果是,那将如何运作?

  3. 我在哪里可以找到ComponentProvider提供的可能性的一些示例,以及对哪种方法做什么的明确解释(例如,我很难理解configureState()format()之间的区别)

  4. 修改

    1. 是否可以防止JX(树)中显示的JButton?表格与单元格一样宽?

    2. 如果我创建另一个荧光笔,我可以使用另一个谓词(ROLLOVER或其他东西)来更改光标吗?即使按钮被隐藏,光标也会变为手(通过链接)。

    3. 非常感谢!

1 个答案:

答案 0 :(得分:2)

有趣: - )

  1. 通常不起作用,因为CellRendererPane不尊重组件的可见属性 - 它总是标记它。但是:如果将实际的提供程序包装到WrappingProvider中,然后将该包装器的组件设置为不可见,则可以在SwingX中工作。
  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仍然存在问题)。

    1. (问题中的2个)不受支持,componentProvider旨在返回在每次调用时配置了完全相同属性的相同单个组件

    2. (问题中有3个)咳嗽......不,只是来源和示例(在演示和测试包中)

    3. 修改(回答问题的编辑部分)

      1. 不,使用当前的WrappingIconpPanel:它确实使用了Borderlayout - 我们都知道:-)不尊重最大尺寸。使用BoxLayout会遇到我不完全记得的问题。然而,这将是调整的地方,以便按钮的最大值得到尊重

      2. 嗯...不完全确定你是如何实现光标更改的。假设它在你的ButtonProvider中:实现isRolloverEnabled以返回true / false,具体取决于它是否可见 Edit-in-Edit 不起作用。不知道为什么,这可能是WrappingProvider中翻转 - 检测和/或处理中的错误

      3. 现在关闭周末: - )