如题所示,我的jtree实现直接继承JTree,自己写了renderer和editor,代码如下,怀疑是这两个有问题,请高人指教@public class CheckBoxTreeCellEditor extends AbstractCellEditor implements
TreeCellEditor {
private CheckBoxTree tree; private JCheckBox box; private DefaultMutableTreeNode node; private CheckBoxTreeEditorRenderer renderer; public CheckBoxTreeCellEditor(CheckBoxTree tree,
CheckBoxTreeEditorRenderer renderer) {
this.tree = tree;
this.renderer = renderer;
} /**
 * @generated "UML 到 Java
 *            (com.ibm.xtools.transform.uml2.java.internal.UML2JavaTransform)"
 */
public Object getCellEditorValue() {
if (node != null && node instanceof DefaultMutableTreeNode) {
if (box != null) {
UniversalTreeNode userObject = (UniversalTreeNode) node
.getUserObject();
if (box.isSelected()) {
getCellEditor(node, PmConstants.TREE_ChectBox_Selected);
} else {
getCellEditor(node, PmConstants.TREE_ChectBox_UnSelected);
}
// tree.repaint();
return userObject;
}
}
return null;
} /**
 * 递归处理级联选中和级联取消
 * 
 * @param rootNode
 * @param SelectedStatus
 * @return
 */
private void getCellEditor(DefaultMutableTreeNode rootNode,
String selectedStatus) {
((UniversalTreeNode) rootNode.getUserObject())
.setSelectable(selectedStatus);
if (rootNode.children() != null) {
Enumeration<DefaultMutableTreeNode> children = rootNode.children();
while (children.hasMoreElements()) {
DefaultMutableTreeNode treeNode = children.nextElement();
getCellEditor(treeNode, selectedStatus);
}
}
} /**
 * 取得一个节点是否可编辑
 * 
 * @param event
 * @return
 */
public boolean isCellEditable(EventObject event) {

return ((UniversalTreeNode) node.getUserObject()).getEditable().equals(
PmConstants.TREE_ChectBox_Editable) ? true : false;
} /**
 * 得到TreeCellEditorComponent
 * 
 * @param tree
 * @param value
 * @param selected
 * @param expanded
 * @param leaf
 * @param row
 * @return
 * @see javax.swing.tree.TreeCellEditor#getTreeCellEditorComponent(javax.swing.JTree,
 *      java.lang.Object, boolean, boolean, boolean, int)
 */
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {
Component editor = renderer.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, true);
node = (DefaultMutableTreeNode) value;
// editor always selected / focused
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof CheckBoxTreeEditorRendererWraper) {
box = renderer.getCheckBox();
box.addItemListener(itemListener);
} return editor;
}}
///////////////////////////////////////////////////////////////RENDER 代码
public class CheckBoxTreeEditorRenderer implements TreeCellRenderer { protected JCheckBox box = new JCheckBox(); public JCheckBox getCheckBox() {
return box;
} /**
 * 取得panel组件
 * 
 * @param tree
 * @param value
 * @param selected
 * @param expanded
 * @param leaf
 * @param row
 * @param hasFocus
 * @return
 */
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
JLabel label = new JLabel();
JPanel panel = new CheckBoxTreeEditorRendererWraper(box, label); DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
UniversalTreeNode userobject = (UniversalTreeNode) node.getUserObject();
box.setSelected(userobject.getSelectable().equals(
PmConstants.TREE_ChectBox_Selected) ? true : false);// 设置checkbox是否被选中
box.setText(userobject.getName());
if (node.isRoot()) {
label.setIcon(userobject.getIcon());
} else {
String status = userobject.getStatus();
String imageurl = getImageIconURL(status);
label.setIcon(new ImageIcon(imageurl));
}
// tree.repaint(); box.setBackground(Color.WHITE);
panel.setBackground(Color.WHITE);

return panel;
} protected String getImageIconURL(String status) {
return null;
}
}
////////实现了上面renderer的内部类,该类在JTree中实现,iconcache是图片的缓存
private class MetricTreeCellRenderer extends CheckBoxTreeEditorRenderer { public String getImageIconURL(String status) {
return iconcache.get(status);
}
}

解决方案 »

  1.   

    兄弟,恕我直言。
    这代码我几乎没有办法看。
    里面有多少你自己定义的东西?你没有给出来,我怕是猜测不出你是怎么定义的那些东西。难道要我来补全?
    把这些代码放到eclipse里面,我该怎么改呢,明显看得出里面和你的业务逻辑已经融合到一起了,你好歹也抽一下,贴上来的代码基本没有编译错误再看吧。我只能修改一些大概的,比如你的那个CheckBoxTree我替换为JTree这样。但是,有一些我只能注掉。可是却又和业务逻辑放到一起,现在我没有办法修改下去了。还不如我自己重新建立一个了。我只能大概说几点了:
    第一, CheckBoxTreeEditorRenderer你getTreeCellRendererComponent返回一个JPanel。虽然这编译起来没有什么问题,但是一般不这么用,除非有很复杂的东西,你这不过一个简单的checkBox,没必要这么用
    第二,所谓renderer和editor应该是作为渲染和编辑的展现工具来使用,他们负责的工作应该单一一些。但是这里,耦合度实在太高。纯属个人意见,如果说的不对,请你包涵了。
      

  2.   

    感谢楼上大哥,还请不吝赐教,我实现的树是这样的,树实现了treeselectionlistener接口,节点中包含图标、复选框和文本,图标是label上面设的,根据节点中userobject的状态从iconcache中获取,文本时复选框的文本,现在的问题是,如果点击复选框,则一切正常,如果点击图片的某个地方,则复选框消失不见困扰了两天了。。
      

  3.   

    因为小弟刚开始做swing的东西,很是不熟悉,想请教一下楼上的大哥如果我不在editor中持有renderer对象,如何在editor中获取renderer中的checkbox呢?请不吝赐教!谢谢!!!
      

  4.   

    恩,我做过一个,你可以参考一下结构public class SettingsPanel extends JPanel implements Observer{ public static Vector<Serializable> plotList = new Vector<Serializable>();

    private static final long serialVersionUID = 1L;
    private JTree $tree;
    private JScrollPane $treeView;
    private JScrollPane $settingsView;
    SVGCanvasVisualizationManager $vm = SVGCanvasVisualizationManager.getVisualizationManager();
    Data $data;
    private HashMap<String, String> $selected;
    //public static HashMap<String, String> $selected;


    /**
     * Creates the SettingsPanel
     */
    public SettingsPanel(){
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
    $vm.addObserver(this);
    $treeView = new JScrollPane();
    $settingsView = new JScrollPane();
    add($treeView);
    add($settingsView);
    }

    /**
     * Creates the nodes of the tree containing all the data elements.
     */
    public void createNodes(){
    DefaultMutableTreeNode topNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.GENERAL,"General", "General"));
    $tree = new JTree(topNode);
    $tree.addTreeSelectionListener(new TreeSelectionListener());
    //Add Modules
    DefaultMutableTreeNode modulesNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.MODULELIST,"Modules","Modules"));
    topNode.add(modulesNode);
    DefaultMutableTreeNode moduleNode;
    for(int i = 0; i < $data.getActiveModuleList().size(); i++){
    moduleNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.MODULE, $data.getActiveModuleIdList().get(i), $data.getActiveModuleIdList().get(i)));
    modulesNode.add(moduleNode);

    }

    //Add Genes
    DefaultMutableTreeNode genesNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.GENELIST,"Genes", "Genes"));
    topNode.add(genesNode);
    DefaultMutableTreeNode geneNode;
    for(int i = 0; i < $data.getActiveGeneList().size(); i++){
    geneNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.GENE, $data.getActiveGeneList().get(i).getId(), $data.getActiveGeneList().get(i).getName()));
    genesNode.add(geneNode);
    }

    //Add Experiments
    DefaultMutableTreeNode experimentsNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.EXPLIST,"Experiments", "Experiments"));
    topNode.add(experimentsNode);
    DefaultMutableTreeNode experimentNode;
    for(int i = 0; i < $data.getActiveExpList().size(); i++){
    experimentNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.EXPERIMENT, $data.getActiveExpList().get(i).getId(), $data.getActiveExpList().get(i).getName()));
    experimentsNode.add(experimentNode);
    }

    //Add Motifs
    DefaultMutableTreeNode motifsNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.MOTIFLIST,"Motifs", "Motifs"));
    topNode.add(motifsNode);
    DefaultMutableTreeNode motifNode;
    for(int i = 0; i < $data.getMotifList().size(); i++){
    motifNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.MOTIF, $data.getMotifList().get(i).getId(), $data.getMotifList().get(i).getName()));
    motifsNode.add(motifNode);
    }

    //Add Regulators
    DefaultMutableTreeNode regulatorsNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.REGLIST,"Regulators", "Regulators"));
    topNode.add(regulatorsNode);
    DefaultMutableTreeNode regulatorNode;
    for(int i = 0; i < $data.getRegList().size(); i++){
    regulatorNode = new DefaultMutableTreeNode(new NodeInfo(NodeInfo.REGULATOR, $data.getRegList().get(i).getId(), $data.getRegList().get(i).getName()));
    regulatorsNode.add(regulatorNode);
    }

    $treeView.setViewportView($tree);
    this.validate();

    }