2

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

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

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

  3. configureState()我在哪里可以找到 ComponentProvider 提供的可能性的一些示例,并清楚地解释哪种方法做什么(例如,我几乎不理解和之间的区别format())?

编辑

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

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

非常感谢!

4

1 回答 1

2

有趣的 :-)

  1. 通常不起作用,因为 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 仍然存在问题)。

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

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

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

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

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

现在进入周末:-)

于 2012-02-17T15:10:50.040 回答