?? treedemo5.java
字號:
/**10-7:JTree的事件處理模式:
在此節中,我們將詳細介紹JTree兩個常用的事件與處理,分別是TreeModeEvent與TreeSelectionEvent.
10-7-1:處理TreeModeEvent事件:
當樹的結構上有任何改變時,例如節點值改變了、新增節點、刪除節點等,都會
TreeModelEvent事件,要處理這樣的事件必須實作TreeModelListener接口,此界面定義了4個方法
如下所示:
TreeModelListener方法:
1、Void treeNodesChanged(TreeModelEvent e):當節點改變時系統就會云調用這個方法。
2、Void treeNodesInserted(TreeModelEvent e):當新增節時系統就會去調用這個方法。
3、Void treeNodesRemoved(TreeModeEvent e):當刪除節點時系統就會去調用這個方法。
4、Void treeStructureChanged(TreeModelEvent e):當樹結構改變時系統就會去調用這個方法。
TreeModelEvent類本身提供了5個方法,幫我們取得事件的信息,如下所示:
TreeModelEvent方法:
1、int[] getChildIndices():返回子節點群的索引值。
2、Object[] getChildren():返回子節點群.
3、Object[] getPath():返回Tree中一條path上(從root nod到leaf node)的節點。
4、TreePath getTreePath():取得目前位置的Tree Path.
5、String toString():取得蝗字符串表示法.
*由TreeModelEvent的getTreePath()方法就可以得到TreePath對象,此對象就能夠讓我們知道
用戶目前正選哪一個節點,TreePath類最常用的方法為:
publicObject getLastPathComponent():取得最深(內)層的節點。
public int getPathCount():取得此path上共有幾個節點.
我們來看下面這個例子,用戶可以在Tree上編輯節點,按下[Enter]鍵后就可以改變原有的值,并將改變的值顯示在下面的
JLabel中:
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
//import com.incors.plaf.alloy.*;
//import com.incors.plaf.alloy.themes.bedouin.*;
public class TreeDemo5 implements TreeModelListener
{
JLabel label = null;
static String nodeName = null; //原有節點名稱
public TreeDemo5(){
UIManager.getLookAndFeelDefaults().put("ClassLoader", getClass().getClassLoader());
JFrame f = new JFrame("TreeDemo");
Container contentPane = f.getContentPane();
DefaultMutableTreeNode root = new DefaultMutableTreeNode("資源管理器");
DefaultMutableTreeNode node1 = new DefaultMutableTreeNode("文件夾");
DefaultMutableTreeNode node2 = new DefaultMutableTreeNode("我的電腦");
DefaultMutableTreeNode node3 = new DefaultMutableTreeNode("收藏夾");
DefaultMutableTreeNode node4 = new DefaultMutableTreeNode("Readme");
root.add(node1);
root.add(node2);
root.add(node3);
root.add(node4);
DefaultMutableTreeNode leafnode = new DefaultMutableTreeNode("公司文件");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("個人信件");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("私人文件");
node1.add(leafnode);
leafnode = new DefaultMutableTreeNode("本機磁盤(C:)");
node2.add(leafnode);
leafnode = new DefaultMutableTreeNode("本機磁盤(D:)");
node2.add(leafnode);
leafnode = new DefaultMutableTreeNode("本機磁盤(E:)");
node2.add(leafnode);
DefaultMutableTreeNode node31 = new DefaultMutableTreeNode("網站列表");
node3.add(node31);
leafnode = new DefaultMutableTreeNode("天勤網站");
node31.add(leafnode);
leafnode = new DefaultMutableTreeNode("足球消息");
node31.add(leafnode);
leafnode = new DefaultMutableTreeNode("網絡書店");
node31.add(leafnode);
//************************************************************************
JTree tree = new JTree(root);
tree.setEditable(true);//設置JTree為可編輯的
tree.addMouseListener(new MouseHandle());//使Tree加入檢測Mouse事件,以便取得節點名稱
//下面兩行取得DefaultTreeModel,并檢測是否有TreeModelEvent事件.
DefaultTreeModel treeModel = (DefaultTreeModel)tree.getModel();
treeModel.addTreeModelListener(this);
//************************************************************************
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportView(tree);
label = new JLabel("更改數據為: ");
contentPane.add(scrollPane,BorderLayout.CENTER);
contentPane.add(label,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void treeNodesChanged(TreeModelEvent e) {
System.out.println("treeNodesChanged");
TreePath treePath = e.getTreePath();
System.out.println(treePath);
//下面這行由TreeModelEvent取得的是以DefaultMutableTreeNode為節點的父節點,而不是
//用戶點選的節點,這點讀者要特別注意。要取得真正的節點需要再加寫下面6行代碼.
DefaultMutableTreeNode node = (DefaultMutableTreeNode)treePath.getLastPathComponent();
try {
//getChildIndices()方法會返回目前修改節點的索引值。由于我們只修改一個節點,因此節點索引值就放在index[0]
//的位置,若點選的節點為root node,則getChildIndices()的返回值為null,程序下面的第二行就在處理點選root
//node產生的NullPointerException問題.
int[] index = e.getChildIndices();
System.out.println(index.length);
//由DefaultMutableTreeNode類的getChildAt()方法取得欲修改的節點對象.
node = (DefaultMutableTreeNode)node.getChildAt(index[0]);
} catch (NullPointerException exc) {}
//由DefaultMutableTreeNode類getUserObject()方法取得節點的內容,或是寫成node.toString()亦相同.
label.setText(nodeName+"更改數據為: "+(String)node.getUserObject());
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
System.out.println("treeNodesRemoved!");
}
public void treeStructureChanged(TreeModelEvent e) {
}
public static void main(String args[]) {
new TreeDemo5();
System.out.println("haha!");
//new TreeDemo5();
}
}
//處理Mouse點選事件
class MouseHandle extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{
try{
JTree tree = (JTree)e.getSource();
//JTree的getRowForLocation()方法會返回節點的列索引值。例如本例中,“本機磁盤(D:)”的列索引值為4,此索引值
//會隨著其他數據夾的打開或收起而變支,但“資源管理器”的列索引值恒為0.
int rowLocation = tree.getRowForLocation(e.getX(), e.getY());
//System.out.println("rowLocation為:"+rowLocation);
//JTree的getPathForRow()方法會取得從root node到點選節點的一條path,此path為一條直線,如程序運行的圖示
//若你點選“本機磁盤(E:)”,則Tree Path為"資源管理器"-->"我的電腦"-->"本機磁盤(E:)",因此利用TreePath
//的getLastPathComponent()方法就可以取得所點選的節點.
TreePath treepath = tree.getPathForRow(rowLocation);
System.out.println("treepath為:"+tree.getSelectionPath());
TreeNode treenode = (TreeNode) treepath.getLastPathComponent();
TreeDemo5.nodeName = treenode.toString();
//System.out.println(treenode.toString());
}catch(NullPointerException ne){}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -