无论如何,总是CellContext
使用的ComponentProvider
表示节点已展开。
这种行为可以追溯到getTableCellRenderer(...)提供的实现DefaultTableRenderer
:两者expanded
和leaf
属性都设置为true
:
public class DefaultTableRenderer extends AbstractRenderer implements TableCellRenderer {
private TableCellContext cellContext;
...
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// both 'expanded' and 'leaf' properties are set to 'true' here:
cellContext.installContext(table, value, row, column, isSelected, hasFocus, true, true);
// 'componentController' is an instance of 'ComponentProvider<?>'
Component comp = componentController.getRendererComponent(cellContext);
cellContext.replaceValue(null);
return comp;
}
...
}
这是有道理的,因为这些属性在树单元格上下文中很重要,而不是表格单元格上下文。如果您将 a 设置TreeCellRenderer
为JXTreeTable
using ,ComponentProvider
那么它应该在第一列(树列)中按预期工作:
ComponentProvider<?> textProvider = new LabelProvider(valueProvider, JLabel.TRAILING) {...};
...
DefaultTreeRenderer treeRenderer = new DefaultTreeRenderer(textProvider);
...
treeTable.setTreeCellRenderer(treeRenderer);
因为CellContext
不会是 aTableCellContext
而是 aTreeCellContext
并且它将包含正确的expanded
和leaf
值:
public class DefaultTreeRenderer extends AbstractRenderer implements TreeCellRenderer {
private TreeCellContext cellContext;
...
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
// both 'expanded' and 'leaf' properties are correctly set here:
cellContext.installContext(tree, value, row, 0, selected, hasFocus, expanded, leaf);
// 'componentController' is an instance of 'ComponentProvider<?>'
Component comp = componentController.getRendererComponent(cellContext);
cellContext.replaceValue(null);
return comp;
}
...
}