Yang
07-23-2007, 04:04 PM
Hello dear patmurris, I make a CheckBoxTree layerset based on your Tree layerset .But it has not events related with the layers. I don't konw how to add listener to the CheckBoxTree .Would you give me some help? Thank you very much! Sincerely yours,Yang
There are my codes.
Those are WWGlobe.java and LayerSet.java.
In the LayerSet.java, I make a "makeVectorNode() " method like the "makeTreeNode()" method.
//makeVectorNode() method:
public Vector makeVectorNode() {
Vector root = new NamedVector(this.getName());
//System.out.println(this.getLayerList());
for (Object layer : this.getLayerList()) {
//System.out.println(layer);
//
if(layer instanceof LayerSet) {
root.add(((LayerSet)layer).makeVectorNod e());
//System.out.println(layer);
} else {
CheckBoxNode cbn=new CheckBoxNode(layer.toString() , true);
CheckBoxNode accessibilityOptions[] = {
cbn,};
Vector accessVector = new NamedVector(layer.toString(),
accessibilityOptions);
//System.out.println(str);
root.add(accessVector);
}
}
//Vector rootVector = new NamedVector("图层");
//rootVector.add(root);
return root;
}
//WWGlobe.java
...
public AppFrame()
{.....
Vector rootVector = new NamedVector("图层1");
rootVector.add(layerset.makeVectorNode() );
JTree layerTree = new JTree(rootVector);
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
layerTree.setCellRenderer(renderer);
layerTree.setCellEditor(new CheckBoxNodeEditor(layerTree));
layerTree.setEditable(true);
...
class CheckBoxNodeRenderer implements TreeCellRenderer {
public JCheckBox leafRenderer = new JCheckBox();
private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
Color selectionBorderColor, selectionForeground, selectionBackground,
textForeground, textBackground;
protected JCheckBox getLeafRenderer() {
/* ItemListener jcb=new ItemListener(){
public void itemStateChanged(ItemEvent e) {
JCheckBox cb = (JCheckBox) e.getSource();
String command = cb.getActionCommand();
if((command == "地球SurfaceLayer" )&& ((cb.isSelected())))
System.out.println(command+"选");
else if((command == "地球SurfaceLayer" )&& (!(cb.isSelected())))
System.out.println(command+"没选");
};};
leafRenderer.addItemListener(jcb);*/
return leafRenderer;
}
public CheckBoxNodeRenderer() {
Font fontValue;
fontValue = UIManager.getFont("Tree.font");
if (fontValue != null) {
leafRenderer.setFont(fontValue);
}
Boolean booleanValue = (Boolean) UIManager
.get("Tree.drawsFocusBorderAroundIcon");
leafRenderer.setFocusPainted((booleanVal ue != null)
&& (booleanValue.booleanValue()));
selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
selectionForeground = UIManager.getColor("Tree.selectionForeground");
selectionBackground = UIManager.getColor("Tree.selectionBackground");
textForeground = UIManager.getColor("Tree.textForeground");
textBackground = UIManager.getColor("Tree.textBackground");
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component returnValue;
if (leaf) {
String stringValue = tree.convertValueToText(value, selected,
expanded, leaf, row, false);
leafRenderer.setText(stringValue);
leafRenderer.setSelected(false);
leafRenderer.setEnabled(tree.isEnabled() );
if (selected) {
leafRenderer.setForeground(selectionFore ground);
leafRenderer.setBackground(selectionBack ground);
} else {
leafRenderer.setForeground(textForegroun d);
leafRenderer.setBackground(textBackgroun d);
}
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
if (userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode) userObject;
leafRenderer.setText(node.getText());
leafRenderer.setSelected(node.isSelected ());
}
}
returnValue = leafRenderer;
} else {
returnValue = nonLeafRenderer.getTreeCellRendererCompo nent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
class CheckBoxNodeEditor extends AbstractCellEditor implements TreeCellEditor {
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
ChangeEvent changeEvent = null;
JTree tree;
public CheckBoxNodeEditor(JTree tree) {
this.tree = tree;
}
public Object getCellEditorValue() {
JCheckBox checkbox = renderer.getLeafRenderer();
CheckBoxNode checkBoxNode = new CheckBoxNode(checkbox.getText(),
checkbox.isSelected());
return checkBoxNode;
}
public boolean isCellEditable(EventObject event) {
boolean returnValue = false;
if (event instanceof MouseEvent) {
MouseEvent mouseEvent = (MouseEvent) event;
TreePath path = tree.getPathForLocation(mouseEvent.getX( ),
mouseEvent.getY());
if (path != null) {
Object node = path.getLastPathComponent();
if ((node != null) && (node instanceof DefaultMutableTreeNode)) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
Object userObject = treeNode.getUserObject();
returnValue = ((treeNode.isLeaf()) && (userObject instanceof CheckBoxNode));
}
}
}
return returnValue;
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {
Component editor = renderer.getTreeCellRendererComponent(tr ee, value,
true, expanded, leaf, row, true);
// editor always selected / focused
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof JCheckBox) {
((JCheckBox) editor).addItemListener(itemListener);
}
return editor;
}
}
class CheckBoxNode {
String text;
boolean selected;
public CheckBoxNode(String text, boolean selected) {
this.text = text;
this.selected = selected;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean newValue) {
selected = newValue;
}
public String getText() {
return text;
}
public void setText(String newValue) {
text = newValue;
}
public String toString() {
return getClass().getName() + "[" + text + "/" + selected + "]";
}
}
There are my codes.
Those are WWGlobe.java and LayerSet.java.
In the LayerSet.java, I make a "makeVectorNode() " method like the "makeTreeNode()" method.
//makeVectorNode() method:
public Vector makeVectorNode() {
Vector root = new NamedVector(this.getName());
//System.out.println(this.getLayerList());
for (Object layer : this.getLayerList()) {
//System.out.println(layer);
//
if(layer instanceof LayerSet) {
root.add(((LayerSet)layer).makeVectorNod e());
//System.out.println(layer);
} else {
CheckBoxNode cbn=new CheckBoxNode(layer.toString() , true);
CheckBoxNode accessibilityOptions[] = {
cbn,};
Vector accessVector = new NamedVector(layer.toString(),
accessibilityOptions);
//System.out.println(str);
root.add(accessVector);
}
}
//Vector rootVector = new NamedVector("图层");
//rootVector.add(root);
return root;
}
//WWGlobe.java
...
public AppFrame()
{.....
Vector rootVector = new NamedVector("图层1");
rootVector.add(layerset.makeVectorNode() );
JTree layerTree = new JTree(rootVector);
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
layerTree.setCellRenderer(renderer);
layerTree.setCellEditor(new CheckBoxNodeEditor(layerTree));
layerTree.setEditable(true);
...
class CheckBoxNodeRenderer implements TreeCellRenderer {
public JCheckBox leafRenderer = new JCheckBox();
private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
Color selectionBorderColor, selectionForeground, selectionBackground,
textForeground, textBackground;
protected JCheckBox getLeafRenderer() {
/* ItemListener jcb=new ItemListener(){
public void itemStateChanged(ItemEvent e) {
JCheckBox cb = (JCheckBox) e.getSource();
String command = cb.getActionCommand();
if((command == "地球SurfaceLayer" )&& ((cb.isSelected())))
System.out.println(command+"选");
else if((command == "地球SurfaceLayer" )&& (!(cb.isSelected())))
System.out.println(command+"没选");
};};
leafRenderer.addItemListener(jcb);*/
return leafRenderer;
}
public CheckBoxNodeRenderer() {
Font fontValue;
fontValue = UIManager.getFont("Tree.font");
if (fontValue != null) {
leafRenderer.setFont(fontValue);
}
Boolean booleanValue = (Boolean) UIManager
.get("Tree.drawsFocusBorderAroundIcon");
leafRenderer.setFocusPainted((booleanVal ue != null)
&& (booleanValue.booleanValue()));
selectionBorderColor = UIManager.getColor("Tree.selectionBorderColor");
selectionForeground = UIManager.getColor("Tree.selectionForeground");
selectionBackground = UIManager.getColor("Tree.selectionBackground");
textForeground = UIManager.getColor("Tree.textForeground");
textBackground = UIManager.getColor("Tree.textBackground");
}
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
Component returnValue;
if (leaf) {
String stringValue = tree.convertValueToText(value, selected,
expanded, leaf, row, false);
leafRenderer.setText(stringValue);
leafRenderer.setSelected(false);
leafRenderer.setEnabled(tree.isEnabled() );
if (selected) {
leafRenderer.setForeground(selectionFore ground);
leafRenderer.setBackground(selectionBack ground);
} else {
leafRenderer.setForeground(textForegroun d);
leafRenderer.setBackground(textBackgroun d);
}
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
if (userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode) userObject;
leafRenderer.setText(node.getText());
leafRenderer.setSelected(node.isSelected ());
}
}
returnValue = leafRenderer;
} else {
returnValue = nonLeafRenderer.getTreeCellRendererCompo nent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
class CheckBoxNodeEditor extends AbstractCellEditor implements TreeCellEditor {
CheckBoxNodeRenderer renderer = new CheckBoxNodeRenderer();
ChangeEvent changeEvent = null;
JTree tree;
public CheckBoxNodeEditor(JTree tree) {
this.tree = tree;
}
public Object getCellEditorValue() {
JCheckBox checkbox = renderer.getLeafRenderer();
CheckBoxNode checkBoxNode = new CheckBoxNode(checkbox.getText(),
checkbox.isSelected());
return checkBoxNode;
}
public boolean isCellEditable(EventObject event) {
boolean returnValue = false;
if (event instanceof MouseEvent) {
MouseEvent mouseEvent = (MouseEvent) event;
TreePath path = tree.getPathForLocation(mouseEvent.getX( ),
mouseEvent.getY());
if (path != null) {
Object node = path.getLastPathComponent();
if ((node != null) && (node instanceof DefaultMutableTreeNode)) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) node;
Object userObject = treeNode.getUserObject();
returnValue = ((treeNode.isLeaf()) && (userObject instanceof CheckBoxNode));
}
}
}
return returnValue;
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row) {
Component editor = renderer.getTreeCellRendererComponent(tr ee, value,
true, expanded, leaf, row, true);
// editor always selected / focused
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
};
if (editor instanceof JCheckBox) {
((JCheckBox) editor).addItemListener(itemListener);
}
return editor;
}
}
class CheckBoxNode {
String text;
boolean selected;
public CheckBoxNode(String text, boolean selected) {
this.text = text;
this.selected = selected;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean newValue) {
selected = newValue;
}
public String getText() {
return text;
}
public void setText(String newValue) {
text = newValue;
}
public String toString() {
return getClass().getName() + "[" + text + "/" + selected + "]";
}
}