Java 从自定义渲染器中获取方法GetTreeCellRenderComponent中的JTree节点文本
我正在自定义JTree,以便某些节点具有复选框,用作基础 因此,我们的想法是编写一个定制的TreeCellRenderer,在本例中它扩展了JPanel并实现了TreeCellRenderer,然后在方法GetTreeCellRenderComponent中,我必须为每个节点决定是否接收复选框 我已经看到了一些典型JTree自定义每个节点图标的其他示例,但它们依赖于将每个节点转换为JLabel并获取其文本,而这里是JPanel 这是我的渲染器的外观:Java 从自定义渲染器中获取方法GetTreeCellRenderComponent中的JTree节点文本,java,swing,jtree,treecellrenderer,Java,Swing,Jtree,Treecellrenderer,我正在自定义JTree,以便某些节点具有复选框,用作基础 因此,我们的想法是编写一个定制的TreeCellRenderer,在本例中它扩展了JPanel并实现了TreeCellRenderer,然后在方法GetTreeCellRenderComponent中,我必须为每个节点决定是否接收复选框 我已经看到了一些典型JTree自定义每个节点图标的其他示例,但它们依赖于将每个节点转换为JLabel并获取其文本,而这里是JPanel 这是我的渲染器的外观: public class CheckTree
public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer{
private CheckTreeSelectionModel selectionModel;
private TreeCellRenderer delegate;
private TristateCheckBox checkBox;
protected CheckTreeManager.CheckBoxCustomizer checkBoxCustomer;
public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){
this.delegate = delegate;
this.selectionModel = selectionModel;
this.checkBox = new TristateCheckBox("");
this.checkBox.setOpaque(false);
setLayout(new BorderLayout());
setOpaque(false);
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
// Inside this if clause, those cells which do not require checkbox will be returned
if({CODE_TO_GET_NODE_TEXT}.startsWith("A")){
return renderer;
}
TreePath path = tree.getPathForRow(row);
if(path != null){
if(checkBoxCustomer != null && !checkBoxCustomer.showCheckBox(path)){
return renderer;
}
if(selectionModel.isPathSelected(path, selectionModel.isDigged())){
checkBox.getTristateModel().setState(TristateState.SELECTED);
}
else{
checkBox.getTristateModel().setState(selectionModel.isDigged() && selectionModel.isPartiallySelected(path) ? TristateState.INDETERMINATE : TristateState.DESELECTED);
}
}
removeAll();
add(checkBox, BorderLayout.WEST);
add(renderer, BorderLayout.CENTER);
return this;
}
}
在本例中,我希望避免为文本以“a”开头的单元格设置三态复选框作为示例。但是我找不到从value参数中获取文本的方法
如果有帮助,以下是我创建JTree的方式:
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
JTree tree = new JTree(root);
// Add nodes to the tree
DefaultMutableTreeNode friends_node = new DefaultMutableTreeNode("Friends");
friends_node.add(new DefaultMutableTreeNode("Anna"));
friends_node.add(new DefaultMutableTreeNode("Amador"));
friends_node.add(new DefaultMutableTreeNode("Jonas"));
friends_node.add(new DefaultMutableTreeNode("Mike"));
friends_node.add(new DefaultMutableTreeNode("Anthony"));
friends_node.add(new DefaultMutableTreeNode("Maya"));
friends_node.add(new DefaultMutableTreeNode("Pepe Vinyuela"));
root.add(friends_node);
tree.setCellRenderer(renderer = new CheckTreeCellRenderer(tree.getCellRenderer(), new CheckTreeSelectionModel(tree.getModel(), dig)));
有什么想法吗?如果您使用的是
String userObject=“Anna”代码>,则可以使用以下方法:
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
Component renderer = delegate.getTreeCellRendererComponent(
tree, value, selected, expanded, leaf, row, hasFocus);
if (value instanceof DefaultMutableTreeNode) {
Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
// Inside this if clause, those cells which do not require checkbox will be returned
if(userObject instanceof String && ((String) userObject).startsWith("A")){
return renderer;
}
//...