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