ListCellRenderer 不在子组件上触发事件

Posted

技术标签:

【中文标题】ListCellRenderer 不在子组件上触发事件【英文标题】:ListCellRenderer not Firing Events on Child Components 【发布时间】:2010-09-16 07:20:12 【问题描述】:

以下 ListCellRenderer 不接收嵌套 ComboBox 上的单击事件。我需要启用某些功能吗?

class FilterCellRenderer implements ListCellRenderer 

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
        Filter filter = (Filter)value;

        JPanel filterPanel = new JPanel();
        FlowLayout layout = new FlowLayout();
        layout.setAlignment(FlowLayout.LEFT);
        filterPanel.setLayout(layout);
        filterPanel.add(new JLabel(filter.getLabel()));

        final List<Object> options = filter.getOptions();
        if (options.size() > 1) 
            JComboBox optionCombo = new JComboBox(new AbstractComboBoxModel() 

                public int getSize() 
                    return options.size();
                

                public Object getElementAt(int index) 
                    return options.get(index);
                
            );
            optionCombo.setSelectedItem(filter.getValue());
            filterPanel.add(optionCombo);
        

        if (isSelected) 
            filterPanel.setBackground(list.getSelectionBackground());
            filterPanel.setForeground(list.getSelectionForeground());
         
        return filterPanel;
    


【问题讨论】:

【参考方案1】:

swing 中的渲染器组件就像“橡皮图章”一样工作——它们只是用来渲染/绘制一个值,而不是以通常的方式添加到父容器中(想想如何在多个地方添加单个组件! )。

听起来您可能想要一个编辑器而不是渲染器(编辑器是一个成熟的组件,可以在任何给定时间添加到一个地方)。如果失败,您将不得不在 JList 上安装 MouseListener。

【讨论】:

【参考方案2】:

由于我不需要选择行,我最终只是动态地将元素添加到具有自定义布局的 JPanel。允许完整的组件行为,而无需修改表。

【讨论】:

【参考方案3】:

这有点棘手。我相信您需要用单列 JTable 替换 JList。然后设置一个表格单元格编辑器以及渲染器。 IIRC,丢失第一次点击可能会出现问题(用于选择已编辑的单元格)。

在每次调用 getCellRendererComponent 之间重用组件也是一个非常好的主意。这些组件被用作印章,然后被丢弃。如果每次都重新创建它们,性能将非常糟糕。

【讨论】:

以上是关于ListCellRenderer 不在子组件上触发事件的主要内容,如果未能解决你的问题,请参考以下文章

Vue父组件调用子组件事件的两种方法

Vue3子组件向父组件返回数据

管理不在 DOM 子树中的子组件

React Native - 处理来自子组件(自定义组件)的父状态,而不在父组件中添加功能

有空delphi子窗体关闭触发父窗体做出一系列改变的操作,主要就是子窗体关闭时能改变父窗体组件状态

有空delphi子窗体关闭触发父窗体做出一系列改变的操作,主要就是子窗体关闭时能改变父窗体组件状态