Java Usage of jTree and jScrollPane #4
We extend the original TreeTest3 by adding the ability to add new nodes.
In general, what is shown in blue is stuff generated by the IDE (not completely, however), and what is shown in black is my typing (I hope you know what I mean).
I will annotate the text in color comments which should be self evident
as to whether they are code or comments.
/*
* TreeTest4.java
*
*NOTE changed node name to include ...Node as per SUN's examples
*i.e., root ->rootNode, child->childNode, etc..
* Created on August 21, 2003, 10:18 AM
*/
/**
*
* @author C. W. David
*/
import javax.swing.tree.*;
import javax.swing.event.*;// needed to get TreeModelListener
//don't forget to set editable true in IDE to get TreeTest3 behavior
import javax.swing.JOptionPane;//added to get interogative dialog for new nodes
public class TreeTest4 extends javax.swing.JFrame implements java.awt.event.WindowListener, java.awt.event.ActionListener {
/** Creates new form TreeTest4 */
public TreeTest4() {
initComponents();
You will note that we had to comment out
"/*DefaultMutableTreeNode*/" before rootNode
and
"DefaultMutableTreeNode childNode, grandchildNode;"
and define them in the variable section, so that they could be passed to other
code.
Note also that we had to do the same with treeModel (below)
/*DefaultMutableTreeNode*/ rootNode=new DefaultMutableTreeNode("Root");
// DefaultMutableTreeNode childNode, grandchildNode;
for (int childIndex=1;childIndex<4;childIndex++){
childNode=new DefaultMutableTreeNode("Child "+childIndex);
rootNode.add(childNode);//add each created child to root
for (int grandChildIndex=1;grandChildIndex<4;grandChildIndex++){
grandchildNode = new DefaultMutableTreeNode("GrandChild "+childIndex+"."+grandChildIndex);
childNode.add(grandchildNode);//add each grandchild to each child
}
}
/*DefaultTreeModel*/ treeModel = new DefaultTreeModel(rootNode);
jTree1.setModel(treeModel);
/*
*the following (which shows below in its exact proper place)
*was inserted by clicking the editable flag to true in the
*other properties of the tree panel on the IDE.
* >>>>>jTree1.setEditable(true);<<<<<<
*It means that we can edit the leaves and nodes, and
*their alphanumeric representation stays the same.
*/
jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
treeModel.addTreeModelListener(new MyTreeModelListener());
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
jScrollPane1 = new javax.swing.JScrollPane();
jTree1 = new javax.swing.JTree();
jButton1 = new javax.swing.JButton();
addWindowListener(this);
jTree1.setEditable(true);
jScrollPane1.setViewportView(jTree1);
getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
jButton1.setText("jButton1");
jButton1.addActionListener(this);
getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);
pack();
}
// Code for dispatching events from components to event handlers.
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == jButton1) {
TreeTest4.this.jButton1ActionPerformed(evt);
}
}
public void windowActivated(java.awt.event.WindowEvent evt) {
}
public void windowClosed(java.awt.event.WindowEvent evt) {
}
public void windowClosing(java.awt.event.WindowEvent evt) {
if (evt.getSource() == TreeTest4.this) {
TreeTest4.this.exitForm(evt);
}
}
public void windowDeactivated(java.awt.event.WindowEvent evt) {
}
public void windowDeiconified(java.awt.event.WindowEvent evt) {
}
public void windowIconified(java.awt.event.WindowEvent evt) {
}
public void windowOpened(java.awt.event.WindowEvent evt) {
}//GEN-END:initComponents
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// Add your handling code here:
We added a button using the IDE, and then under Events, created the
shell of code for jButton1ActionPerformed, to which we added the two
lines shown below.
The first line interogates the user for a string to be used as the
text in the node.
The second line does the dirty deed with code shown at the bottom
String s = (String)JOptionPane.showInputDialog(this,"Enter a Node value");
addObject(s);
}//GEN-LAST:event_jButton1ActionPerformed
/** Exit the Application */
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
System.exit(0);
}//GEN-LAST:event_exitForm
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
new TreeTest4().show();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTree jTree1;
// End of variables declaration//GEN-END:variables
Here are the definitions which were removed from above
DefaultMutableTreeNode rootNode;
DefaultMutableTreeNode childNode, grandchildNode;
DefaultTreeModel treeModel;
Here are the old Listener code lines
class MyTreeModelListener implements TreeModelListener{
//subroutine inserted by IDE:
public void treeNodesChanged(TreeModelEvent e){
/*text from java.sun.com/docs.tutorial/uiswing/components/tree.html
* hand copied directly
*/
DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode)(e.getTreePath().getLastPathComponent());
/*
*If the event lists children, then the changed node
*is the child of the node we've already gotten.
*Otherwise, the changed node and the specified node
*are the same
*/
try{
int index= e.getChildIndices()[0];
node = (DefaultMutableTreeNode)(node.getChildAt(index));
} catch (NullPointerException exc){}
System.out.println("The User has finished editing the node.");
System.out.println("The New Value is "+node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
System.out.println("treeNodesInserted");//added
}
public void treeNodesRemoved(TreeModelEvent e) {
System.out.println("treeNodesRemoved");//added
}
public void treeStructureChanged(TreeModelEvent e) {
System.out.println("treeStructureChanged");//added
}
}
/*this code is from the sun documentation, and Richard Stanford's example
*of how to insert nodes
*/
Here is the new code required to add an object
public DefaultMutableTreeNode addObject(Object child){
DefaultMutableTreeNode parentNode = null;
TreePath parentPath = jTree1.getSelectionPath();
if(parentPath == null){
//there's no selection, default to the root node
parentNode = rootNode;
}else{
parentNode = (DefaultMutableTreeNode)
(parentPath.getLastPathComponent());
}
return addObject(parentNode,child,true);
}
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child){
return addObject(parent,child,false);
}
public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
Object child, boolean shouldBeVisible){
DefaultMutableTreeNode childNode =
new DefaultMutableTreeNode(child);
if(parent == null){
parent = rootNode;
}
treeModel.insertNodeInto(childNode,parent,parent.getChildCount());
//make sure the user can see the loverly new node.
if (shouldBeVisible){
jTree1.scrollPathToVisible(new TreePath(childNode.getPath()));
}
return childNode;
}
}
Return to the main book TOC.