【问题标题】:Swingx component provider: hide component on certain rowsSwingx 组件提供程序:在某些行上隐藏组件
【发布时间】:2013-03-20 01:41:20
【问题描述】:

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

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

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

  3. 我在哪里可以找到 ComponentProvider 提供的一些可能性示例,以及哪个方法做什么的清晰说明(例如,我几乎不明白 configureState()format() 之间的区别)?

编辑

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

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

非常感谢!

【问题讨论】:

    标签: java swing swingx jxtable jxtreetable


    【解决方案1】:

    有趣:-)

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

    一个sn-p,就像概念验证

    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 中)(wrappingProvider 最初是用于JXTree,默认情况下没有安装它,因为 ComponentOrientation 仍然存在问题)。

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

    2. (问题中有 3 个)咳咳……不,只有源代码和示例(在演示和测试包中)

    编辑(回答问题的已编辑部分)

    1. 不,对于当前的 WrappingIconpPanel:它确实使用了 Borderlayout - 我们都知道 :-) 不考虑最大尺寸。使用 BoxLayout 会但有一些我不完全记得的问题。不过,这将是调整的地方,以便尊重按钮的最大值

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

    现在进入周末 :-)

    【讨论】:

    • 非常感谢您准确而完整的回答 :) 请看看我的编辑,我的脑海里又冒出一个问题!
    • 我有一个奇怪的错误。 Eclipse 找不到 ButtonProvider 类。我的类路径中有 SwingX 1.6.4 二进制 jar。
    • @Marco 你必须自己实现它(在测试层次结构中可能有一个例子,你需要从 svn 中签出源代码才能抓住它——不过不要钉牢 :-) 顺便说一句:最新版本是 1.6.5-1
    猜你喜欢
    • 2021-04-20
    • 2021-12-01
    • 2021-01-29
    • 2018-07-29
    • 2011-03-24
    • 2021-11-30
    • 2021-11-26
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多