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 不在子组件上触发事件的主要内容,如果未能解决你的问题,请参考以下文章
React Native - 处理来自子组件(自定义组件)的父状态,而不在父组件中添加功能